我使用ngResource在亚马逊Web服务上调用REST API得到这个错误:

XMLHttpRequest无法加载 http://server.apiurl.com: 8000 / s /登录吗? =登录facebook。应对 飞行前请求未通过门禁检查:否 'Access-Control-Allow-Origin'头出现在被请求的对象上 资源。因此,来源“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的头文件。


当前回答

你遇到了CORS问题。

有几种方法可以修复或解决这个问题。

关闭CORS。例如:如何在Chrome中关闭CORS 为你的浏览器使用插件 使用代理,例如nginx。示例如何设置 完成服务器的必要设置。这与您在EC2实例上加载的web服务器有关(假设这就是您所说的“Amazon web服务”)。对于特定的服务器,可以参考启用CORS网站。

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

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

所以api.serverurl.com可能变成localhost:8000/api,你的本地nginx或其他代理将发送到正确的目的地。


现在,根据大众的需求,更多的CORS信息-同样的美味!


绕过CORS正是为那些只是学习前端的人所展示的。 带有承诺的HTTP示例

其他回答

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

将这些行放入index.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');

我认为在Chrome中禁用CORS不是一个好方法,因为如果你在Ionic中使用它,在移动版本中肯定会再次出现这个问题。

所以最好修改后端。

首先,在header中,需要设置-

标题(“Access-Control-Allow-Origin: *”); header(' header set Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"');

如果API的行为是GET和POST,那么也设置在你的头-

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {if (收取($ _SERVER [' HTTP_ACCESS_CONTROL_REQUEST_METHOD '])) header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 如果收取($ _SERVER [' HTTP_ACCESS_CONTROL_REQUEST_HEADERS '])) 标题(“Access-Control-Allow-Headers: {$ _SERVER [' HTTP_ACCESS_CONTROL_REQUEST_HEADERS ']}”);退出(0);}

使用API网关中的CORS选项,我使用了上面所示的以下设置。

另外,请注意,函数必须返回HTTP状态200以响应OPTIONS请求,否则CORS也会失败。

你遇到了CORS问题。

有几种方法可以修复或解决这个问题。

关闭CORS。例如:如何在Chrome中关闭CORS 为你的浏览器使用插件 使用代理,例如nginx。示例如何设置 完成服务器的必要设置。这与您在EC2实例上加载的web服务器有关(假设这就是您所说的“Amazon web服务”)。对于特定的服务器,可以参考启用CORS网站。

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

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

所以api.serverurl.com可能变成localhost:8000/api,你的本地nginx或其他代理将发送到正确的目的地。


现在,根据大众的需求,更多的CORS信息-同样的美味!


绕过CORS正是为那些只是学习前端的人所展示的。 带有承诺的HTTP示例

JavaScript XMLHttpRequest和Fetch遵循同源策略。所以, 使用XMLHttpRequest或Fetch的web应用程序只能生成HTTP 请求到自己的域。

来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

你必须从你的服务器端发送Access-Control-Allow-Origin: * HTTP报头。

如果你使用Apache作为你的HTTP服务器,那么你可以像这样把它添加到你的Apache配置文件中:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

Mod_headers在Apache中默认是启用的,但是,你可能想通过运行以下命令来确保它是启用的:

 a2enmod headers