Cors 阻止 Nginx 上状态为 403 的请求

Posted

技术标签:

【中文标题】Cors 阻止 Nginx 上状态为 403 的请求【英文标题】:Cors Blocks Request with status 403 on Nginx 【发布时间】:2014-07-29 23:01:43 【问题描述】:

我在 nginx 上运行 CORS 时遇到了一个奇怪的问题,CORS 在所有情况下都可以正常工作,但只有一种情况是服务器响应 403 http 响应。

基本上,当我使用正确的凭据登录时,cors 请求可以正常工作,但是当我提供错误的登录凭据时,服务器(后端)会以 403 状态响应,并且出现以下错误 "NetworkError: 403 Forbidden - @987654321@" login Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at @987654322@. This can be fixed by moving the resource to the same domain or enabling CORS. 如果凭据正确,我不会收到此错误,并且一切正常。

我已经完成了启用 CORS 的配置,它似乎对其他一切都运行良好。

以下是请求标头

请求标头 User-Agent:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0 Referer:@987654323@ Pragma: no-cache Origin: @987654324@ Host: www.mydomain.com Content-Type: application/json;charset=utf-8 Content-Length: 74 Connection: keep-alive Cache-Control: no-cache Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Accept: application/json, text/plain, / 响应标头 Server: nginx/1.4.1 Date: Tue, 10 Jun 2014 05:28:30 GMT Content-Type: application/json; charset=utf-8 Content-Length: 76 Connection: keep-alive

【问题讨论】:

也许粘贴请求和响应标头将有助于回答您的问题 @Marcel 我已经用请求和响应标头更新了帖子 这看起来不是问题,RESTFUL API 意味着如果您输入错误的凭据,它会响应 403,这是应该的。 @Marcel 绝对,问题是当服务器响应 403 时,我开始在萤火虫控制台上收到 CORS 错误。 粘贴的标头中没有与 CORS 相关的标头。 【参考方案1】:

nginx(>=1.75) 的一个选项是在add_header 中指定always 参数:

如果指定了always参数(1.7.5),头域将是 无论响应代码如何都添加。

【讨论】:

【参考方案2】:

我假设您正在使用add_header 指令在 nginx 配置中添加 CORS 标头。

Nginx 模块引用状态关于add_header:

如果响应代码等于 200、201、204、206、301、302、303、304 或 307,则将指定字段添加到响应标头。

要解决问题,您可以使用 ngx_headers_more 模块将 CORS 标头也设置为错误响应。

more_set_headers 'Access-Control-Allow-Origin: $http_origin';

more_set_headers 'Access-Control-Allow-Headers: Content-Type, Origin, Accept, Cookie';

【讨论】:

以上是关于Cors 阻止 Nginx 上状态为 403 的请求的主要内容,如果未能解决你的问题,请参考以下文章

我的请求是跨源请求吗?(heroku 上的 Django rest api,CORS 没有阻止我的请求)

spring CORS 和 Angular 不起作用:HTTP 状态代码 403 错误

CORS 适用于 plnkr,但不适用于浏览器:“响应具有 HTTP 状态代码 403”

跨域请求仅在 Firefox 中被阻止! [选项:403 禁止]

CORS 问题:预检响应具有无效的 HTTP 状态代码 403

CORS 仅阻止 localhost 请求