php - angularjs和PHP:在飞行前响应中,Access-Control-Allow-Headers不允许请求 header 字段Access-Control-Allow-Origin

标签 php angularjs cors

我正在尝试从angularjs到虚拟php文件进行简单的POST,以了解其工作原理。
在我的angularjs部分中:

<html ng-app="loginApp">
  <head>
    <meta charset="utf-8">
    <title>Login</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
      <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
    <script>
      var logindata = {username:'abc', password:'abc'}
      var loginApp = angular.module('loginApp', []);
      loginApp.controller('loginCtrl', function ($scope, $http){        
        var request = $http({
            method: "POST",
            url: "http://different-ip/a.php",                    
            data: logindata,
            headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'Basic ' + btoa(logindata.username + logindata.password), 
            'Access-Control-Allow-Origin': "*"}
        });

        request.success(
            function( data ) {
                $scope.someVariableName = data;
            }
        );
    });
    </script>
  </head>
  <body ng-controller="loginCtrl">
    <h2>Angular.js JSON Fetching Example</h2>
    <p> {{ someVariableName }} </p>
  </body>
</html>

这是我位于http://different-ip上的PHP部分(a.php)
<?php
  header("Access-Control-Request-Method: *");
  header("Access-Control-Request-Headers: *");
  header("Access-Control-Allow-Origin: *");
  file_put_contents("aa.txt", json_decode(file_get_contents('php://input'),true));
  file_put_contents("aaa.txt", getallheaders());
?> 

当我执行angularjs文件时,Chrome控制台会显示以下错误:
Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers in preflight response.

当我尝试使用Postman对a.php进行发布时,一切正常。那为什么angularjs不允许呢?
我尝试阅读有关CORS的文章,但对于如何解决此问题(代码方面),没有直接的答案。有人可以帮我吗?提前致谢。

最佳答案

在我的PHP文件中添加了此标题,而不是当前的标题,现在它可以工作了!感谢@Armen的帮助!

    if (isset($_SERVER['HTTP_ORIGIN'])) {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

        exit(0);
    }

关于php - angularjs和PHP:在飞行前响应中,Access-Control-Allow-Headers不允许请求 header 字段Access-Control-Allow-Origin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35147450/

相关文章:

php - 将 PHP 从开发推向生产

php - 无法使用php将数据插入数据库(mysql)

php - $_POST 中没有任何内容。我的代码有问题吗?

javascript - AngularJS - 异步调用 Facebook API

javascript - AngularJS 中的 $scope.$apply - 每次执行的函数都是最后定义的函数

javascript - 如何在静态 Github 页面上发出 WolframAlpha 请求?

php - 在外部 PHP 上使用 IPSLib for IP.Board

javascript - 如何将 $scope 变量传递到自定义指令的字符串模板中?

javascript - 检测服务器/站点对跨域 XMLHttpRequests 的支持?

node.js - SEC7118 : XMLHttpRequest for/socket. io/1/?t=1370206038749 需要跨源资源共享 (CORS)