CORS 标头在浏览器中被剪切,状态码 >= 400

Posted

技术标签:

【中文标题】CORS 标头在浏览器中被剪切,状态码 >= 400【英文标题】:CORS headers are cut in browser for status codes >= 400 【发布时间】:2015-11-14 07:12:39 【问题描述】:

我正在对 web AngularJS 应用程序(1.3 版本)进行一些更改。对于 ajax 调用,我使用 $http。所有请求都是跨域的,所以我在来自服务器的所有响应中使用 CORS 标头。

我的问题是,由于无法解释的原因,当我在 Chrome 中监视它们时,所有 CORS 标头都被剪切(对于 Firefox 也是如此),但我在 Fiddler 响应中看到它们。 状态代码 >= 400 的请求会发生这种情况。因此,所有状态码为 200 的请求在响应中都有 CORS 标头。

在提琴手我看到:

Access-Control-Allow-Headers: Origin, Content-Type, Accept, Cache-Control
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS
Access-Control-Allow-Origin: *
Connection: keep-alive

但在浏览器中我看到:

Connection: close

这是 $http 总是返回 0 作为状态码的原因。对于 1.4.0 Angular $http 已重写,即使没有 CORS 标头也可以正常工作,但我现在无法更新 Angular 库。

有人遇到同样的问题吗?

【问题讨论】:

您使用什么作为 HTTP 服务器?阿帕奇? 尝试了 IIS8 和节点服务器 (***.com/questions/6084360/…) 你是如何添加 CORS 标头的? API 假定控制这个问题。我不知道怎么做,对不起。无论如何,我试图从我的家用电脑发送相同的请求。那里一切正常。这真的很奇怪。我认为某些设置已损坏。窗户... IIS8 应该有自己的 400 响应,我认为您可以对其进行修改以包含 CORS 标头。在 node.js 上,您还必须为您的 400 响应显式发送这些标头。无论如何,为什么您需要在 400 个响应代码上使用 CORS? 【参考方案1】:

我在尝试通过启用 CORS 的连接接收 400 状态代码时发现了一些问题。

从 A 到 B 的 AJAX POST 请求将导致对 B 的两个请求。首先是使用 OPTIONS 方法的预检请求。如果预检成功,则会发出 POST 请求。

当 A 向 B 发送 OPTIONS 请求时。B 必须使用所有 CORS 标头和状态码 200 来回答。(200 很重要!)。

当 A 向 B 发送 POST 请求时,B 必须再次使用所有 CORS 标头进行响应,这一次状态码对 CORS 不重要,您可以使用任何合适的状态码。

Firefox 控制台非常擅长告诉您 CORS 请求中具体失败的原因,请确保您关闭了所有不同的过滤器。

【讨论】:

您知道吗,通过这个解释,您解决了我 8 个月以来遇到的问题,是的,我从 8 个月以来就遇到了这个问题,我不是在开玩笑。我找不到感谢你的话【参考方案2】:

我遇到了同样的问题。保存“Cache-Control”标头仅设置为“no-cache”。如果设置了“no-store”,那么在 Chrome 的控制台中你可能不会响应 >= 400 的请求。

【讨论】:

以上是关于CORS 标头在浏览器中被剪切,状态码 >= 400的主要内容,如果未能解决你的问题,请参考以下文章

为啥将用户标识符存储在 HTTP 请求标头字段中被认为是无状态的,但将其存储在 URI 中却不是?

Nginx Web 浏览器 CORS 问题

被 CORS 策略阻止:对预检的响应...没有 HTTP ok 状态。标头没有解决问题

为啥浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检

即使在发送 CORS 标头后从浏览器发送请求到播放服务器时也出现 CORS 错误

由于cors,Angular 1.5响应状态返回NULL(-1)而不是503