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

And*_*des 392 javascript ajax http cors http-status-code-405

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

XMLHttpRequest无法加载 http://server.apiurl.com:8000/s/login?login=facebook.对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.原产地" :HTTP //本地主机,因此"是不允许访问. 错误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'}
            });
}]);
Run Code Online (Sandbox Code Playgroud)

控制器:

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

我正在使用Chrome,我不知道还有什么可以解决这个问题.我甚至将服务器配置为接受来自源的头文件localhost.

E. *_*ini 213

您正在遇到CORS问题.

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

  1. 关闭CORS.例如:如何关闭chrome中的cors
  2. 为您的浏览器使用插件
  3. 使用代理,如nginx.如何设置的示例

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

通过关闭它只是为了让你的工作完成(好吧,如果你访问其他网站并给你带来不好的安全性,你可以使用代理,这会让你的浏览器认为所有请求都来自本地主机)你真的有本地服务器然后调用远程服务器.

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


现在受欢迎的需求,100%的CORS信息 ......同样很棒的味道!


而对于downvoters来说......绕过CORS正是那些只是学习前端的人所展示的. https://codecraft.tv/courses/angular/http/http-with-promises/

  • 遗漏了正确实施CORS的明显问题 (680认同)
  • 投票很容易.我自己的朋友不太容易冒险.所有这些都完全在开发环境中工作. (35认同)
  • @charlietfl怎么样? (13认同)
  • 在浏览器中禁用 cors?这不是解决方案,而是一种解决方法,对真正需要启用 CORS 的人没有帮助。 (12认同)
  • 关闭 chrome 中的 cors 或 chrome 中的插件从来没有真正的解决方案(如果网站有 CORS 问题,您会要求每个客户端之前禁用其 CORS?)。感谢您的回复,但我希望您将这两点标记为假解决方案。真正的解决方案是配置 WS/API 以允许允许的来源 (6认同)
  • @JonathanSimas 如前所述,这是继续开发工作的几种方法之一。变通办法是解决方案。您甚至会在我的回答中注意到,我说这安全性很差,实际上只是把罐头踢到路上。;-) (4认同)
  • 它确实有效.我添加了标志以禁用Web安全性.对于发展是好的. (3认同)
  • 谢谢你救了我的日子。仅使用第一个选项:C:\ Program Files(x86)\ Google \ Chrome \ Application> chrome.exe --user-data-dir =“ C:\ Chrome开发者会话” --disable-web-security。来自:/sf/ask/217197361/#answer-19317888 (2认同)
  • 您至少应该提到,有一个在许多情况下都是正确的解决方案,即设置 CORS。如果你这样做,反对票就会减少甚至不再有 (2认同)

Sli*_*eam 154

我的"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');
Run Code Online (Sandbox Code Playgroud)

  • 将它放在Angular 6项目中的哪个位置? (9认同)
  • @whatthefish这是服务器端的更改,而不是客户端的更改。 (5认同)
  • 我同意,这比接受的答案要好,但在复制这些行时要小心,确保修改方法和原点. (2认同)

小智 40

在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();
                });
    });
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{


    // Shows UseCors with named policy.
    app.UseCors("AllowAllHeaders");
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

并穿上[EnableCors("AllowAllHeaders")]控制器.

  • 如果您想构建跨站点脚本漏洞,这是一个很好的答案!请不要这样做!指定您可以访问的域以避免安全问题.CORS是有原因的. (15认同)
  • 只是为了更清楚@paqogomez,在您的 ConfigureServices 方法中: services.AddCors(options => { options.AddPolicy("AllowSpecificOrigin", builder => { builder.WithOrigins("http://localhost") .AllowAnyOrigin() 。 AllowAnyHeader() .AllowAnyMethod(); }); }); 并在您的配置方法中: app.UseCors("AllowSpecificOrigin"); (3认同)

Sas*_*vic 22

关于CORS,有一些警告。首先,它不允许使用通配符,*但不要让我受此限制,因为我已经在某处阅读过它,现在找不到该文章。

如果要从其他域发出请求,则需要添加允许来源标头。 Access-Control-Allow-Origin: www.other.com

如果你正在影响服务器资源,如POST / PUT /补丁,如果MIME类型是比下面的不同要求application/x-www-form-urlencodedmultipart/form-datatext/plain浏览器会自动进行飞行前的OPTIONS请求来检查与服务器是否会允许它。

因此,您的API /服务器需要相应地处理这些OPTIONS请求,您需要以适当的方式进行响应,access control headers并且http响应状态代码必须为200

标头应该是这样的,根据您的需要进行调整: Access-Control-Allow-Methods: GET, POST, PUT, PATCH, POST, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400 max-age标头很重要,在我的情况下,没有标头就无法工作,我想浏览器需要“访问权限”持续时间的信息有效。

另外,如果您要从其他域发出例如mime 的POST请求,则application/json还需要添加前面提到的allow origin标头,因此如下所示:

Access-Control-Allow-Origin: www.other.com Access-Control-Allow-Methods: GET, POST, PUT, PATCH, POST, DELETE, OPTIONS Access-Control-Allow-Headers: Content-Type Access-Control-Max-Age: 86400

当预检成功并获得所有所需信息后,您的实际请求将被提出。

一般而言,Access-Control在初始或飞行前请求中请求的任何标头都应在响应中给出,以使其起作用。

此链接的MDN文档中有一个很好的示例,您还应该查看此SO帖子。


Tad*_*dej 14

JavaScript XMLHttpRequestFetch遵循同源策略.因此,使用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>
Run Code Online (Sandbox Code Playgroud)

默认情况下,在Apache中启用Mod_headers,但是,您可能希望通过运行以下命令来确保它已启用:

 a2enmod headers
Run Code Online (Sandbox Code Playgroud)

  • @Shubham Arya:Windows默认位置是`C:\Program Files\Apache\Apache2\conf\httpd.conf`,您可以在http://httpd.apache.org/docs/2.0/platform/windows中找到更多详细信息。 XML (2认同)

fre*_*dev 10

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

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

"permissions": [
   "http://example.com/*",
   "https://example.com/*"
]
Run Code Online (Sandbox Code Playgroud)

  • 还要检查您是否有 www 前缀 (3认同)

hug*_*ugs 8

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

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]
Run Code Online (Sandbox Code Playgroud)


Sun*_*mar 7

如果您偶然使用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';
Run Code Online (Sandbox Code Playgroud)

有这个所有帖子,得到等,将工作正常.


Ter*_*lus 5

对于python的flask服务器,你可以使用flask-cors插件来开启跨域请求。

请参阅:https : //flask-cors.readthedocs.io/en/latest/


ati*_*ruz 5

在PHP中,您可以添加标题:

<?php
header ("Access-Control-Allow-Origin: *");
header ("Access-Control-Expose-Headers: Content-Length, X-JSON");
header ("Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS");
header ("Access-Control-Allow-Headers: *");
...
Run Code Online (Sandbox Code Playgroud)


Roh*_*rte 5

要解决Node JS应用程序中的跨域请求问题:

npm i cors
Run Code Online (Sandbox Code Playgroud)

只需将下面的行添加到 app.js

let cors = require('cors')
app.use(cors())
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于 express js 应用程序,而不适用于所有节点应用程序 (3认同)

w00*_*ngy 5

我们的团队偶尔会使用 Vue、axios 和 C# WebApi 看到这种情况。在您尝试点击的端点上添加路由属性可为我们修复它。

[Route("ControllerName/Endpoint")]
[HttpOptions, HttpPost]
public IHttpActionResult Endpoint() { }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1038648 次

最近记录:

6 年 前