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

我得到这个错误使用ngResource调用Amazon Web Services上的REST API:

XMLHttpRequest无法加载http://server.apiurl.com:8000/s/login?login=facebook 。 对预检请求的响应不会通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。 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); } [...] 

我正在使用铬,我不知道还有什么可以解决这个问题。 我甚至将服务器configuration为接受来自origin localhost头文件

您遇到了CORS问题。

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

  1. closuresCORS。 例如: 如何closureschrome中的cors
  2. 为您的浏览器使用插件
  3. 使用一个代理,如nginx。 如何设置的例子

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

通过closures它只是为了完成你的工作(好吧,如果你访问其他网站,只是把可怜的安全性放在路上),你可以使用代理,使浏览器认为所有的请求都来自本地主机真的,你有本地服务器,然后调用远程服务器。

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

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

将行放在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'); 

在AspNetCore web api中,通过添加“Microsoft.AspNetCore.Cors”(版本1.1.1)并在Startup.cs中添加以下更改,可以解决此问题。

 public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy("AllowAllHeaders", builder => { builder.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); . . . } 

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // Shows UseCors with named policy. app.UseCors("AllowAllHeaders"); . . . } 

并在控制器上放置[EnableCors("AllowAllHeaders")]

JavaScript XMLHttpRequestFetch遵循同源策略。 因此,使用XMLHttpRequest或Fetch的Web应用程序只能向自己的域发出HTTP请求。

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

您必须从您的服务器端发送访问控制 – 允许来源:* HTTP标头。

如果您使用Apache作为HTTP服务器,那么您可以将其添加到Apacheconfiguration文件中,如下所示:

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

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

  a2enmod headers 

对于python烧瓶服务器,您可以使用flask-cors插件启用跨域请求。

见: https : //flask-cors.readthedocs.io/en/latest/

如果你正在编写一个chrome扩展

您必须在manifest.json添加您的域的权限。

 "permissions": [ "http://example.com/*", "https://example.com/*" ] 

在我的Apache VirtualHostconfiguration文件中,我添加了以下几行:

 Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Max-Age "1000" Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token" RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] 

如果你偶然使用IIS服务器。 您可以在HTTP请求标题选项中设置以下标题。

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

与这个所有职位,得到等等,将工作正常。

当DNS服务器设置为8.8.8.8(google的)时,我遇到了这个问题。 其实,问题是在路由器,我的应用程序试图通过谷歌连接到服务器,而不是本地(对于我的具体情况)。 我已经删除了8.8.8.8,这解决了这个问题。 我知道CORS设置解决了这个问题,但也许有人会和我一样麻烦

一些很容易错过的东西…

在解决scheme资源pipe理器中,右键单击api-project。 在属性窗口中设置“匿名身份validation”启用!