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 中却不是?
被 CORS 策略阻止:对预检的响应...没有 HTTP ok 状态。标头没有解决问题
为啥浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检