对预检请求的响应未通过访问控制检查

我收到此错误,使用ngResource在Amazon Web Services上调用REST API:

XMLHttpRequest 无法加载 http://server.apiurl.com:8000/s/login?login=facebook。对预检请求的响应未通过访问控制检查:请求的资源上不存在“访问控制-允许-源”标头。因此,不允许访问源“http://localhost”。错误 405

服务:

socialMarkt.factory('loginService', ['$resource', function ($resource) {
    var apiAddress = "http://server.apiurl.com:8000/s/login/";
    return $resource(apiAddress, {
        login: "facebook",
        access_token: "@access_token",
        facebook_id: "@facebook_id"
    }, {
        getUser: {
            method: 'POST'
        }
    });
}]);

控制器:

[...]
loginService.getUser(JSON.stringify(fbObj)),
    function (data) {
        console.log(data);
    },
    function (result) {
        console.error('Error', result.status);
    }
[...]

我正在使用Chrome,我不知道该怎么做才能解决此问题。我甚至将服务器配置为接受来自源的标头。localhost


答案 1

您遇到了 CORS 问题。

有几种方法可以解决此问题。

  1. 关闭 CORS。例如:如何关闭铬合金中的cors
  2. 为浏览器使用插件
  3. 使用代理,如nginx。如何设置的示例
  4. 完成服务器的必要设置。这更像是您在 EC2 实例上加载的 Web 服务器的一个因素(假设这就是您所说的“Amazon Web 服务”)。对于您的特定服务器,您可以参考启用 CORS 网站。

更详细地说,您正在尝试从localhost访问 api.serverurl.com。这是跨域请求的确切定义。

通过关闭它只是为了完成你的工作(好吧,但如果你访问其他网站并且只是踢了罐子),或者你可以使用一个代理,让你的浏览器认为所有请求都来自本地主机,而实际上你有本地服务器,然后调用远程服务器。

因此 api.serverurl.com 可能会成为localhost:8000 / api,并且您的本地nginx或其他代理将发送到正确的目的地。


现在,根据大众需求,100%更多的CORS信息....同样很棒的味道!


绕过CORS正是为那些只是学习前端的人所展示的。https://codecraft.tv/courses/angular/http/http-with-promises/


答案 2

我的“API服务器”是一个PHP应用程序,所以为了解决这个问题,我发现了以下解决方案:

将行放在索引中.php

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');