对预检请求的响应不会通过访问控制检查
我得到这个错误使用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问题。
有几种方法可以解决这个问题。
- closuresCORS。 例如: 如何closureschrome中的cors
- 为您的浏览器使用插件
- 使用一个代理,如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 XMLHttpRequest和Fetch遵循同源策略。 因此,使用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”启用!