每当 CORS $http 请求失败时,返回的响应始终为 0

Posted

技术标签:

【中文标题】每当 CORS $http 请求失败时,返回的响应始终为 0【英文标题】:Whenever a CORS $http request fails, the response returned is always 0 【发布时间】:2015-09-27 13:06:33 【问题描述】:

这与 SO 中的 post 类似。但此处提供的答案不适用于我的情况,因为我无法更改服务器的响应标头。

假设一个 http POST 到不同的来源。这意味着 CORS,包括 CORS 飞行前交换。现在假设 OPTIONS 请求由于服务器问题返回 503 service unavailable 错误。在这种情况下,错误处理程序为数据提供"",为状态提供0,而不是为我提供状态代码503和文本:service not available。下图说明了这种情况的一个示例。

我正在使用 angularjs $http,如果发生此类错误,我知道在响应中没有 CORS 标头。我无法更改它。

有什么方法可以让我收到正确的错误代码和拒绝对象中的文本。

【问题讨论】:

我可能会问一个显而易见的问题,但是如果您无法更改服务器并且您知道它没有 CORS 标头,那么您为什么还要尝试在第一个跨站点请求地点? @Claies 感谢您抽出宝贵时间!服务器为所有成功的请求发送 CORS 标头。但是当像 503-service unavailable 这样的错误发生时,它根本不发送我无法控制的 CORS 标头。 嗯我以前从未遇到过这类问题,但我会对此进行一些研究,看看我能挖掘出什么。 我也在尝试深入研究,看看为什么 Angular 将真实状态码转换为 0。 @Claies 这个响应头是获取状态码的唯一原因吗? 【参考方案1】:

这不是 AngularJS / $http 的问题,而是浏览器及其 XMLHttpRequest 对象的行为:如果 CORS 请求失败,浏览器不会将任何信息返回给调用者。

在我得到这个理解之前,我也认为这是一个 AngularJS 问题,我在 Angular 的 github 上提出了一个未解决的问题 -> 并带有相应的评论。

https://github.com/angular/angular.js/issues/13085#issuecomment-148047721

所以我认为似乎没有其他方法可以解决这个问题,例如在 503 的情况下也在代理/负载均衡器上添加 Access-Control-Allow-Origin 响应标头。

编辑: 如果您的负载均衡器是 HAproxy,以下内容也可能对您有所帮助:HAproxy: different 503 errorfile for OPTIONS and POST methods 它展示了如何让 HAproxy 自主响应 CORS 请求。

【讨论】:

以上是关于每当 CORS $http 请求失败时,返回的响应始终为 0的主要内容,如果未能解决你的问题,请参考以下文章

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

CORS - jQuery 获取 ajax 响应状态失败

Angular 跨域请求 CORS 失败,但节点 http.get() 成功返回

当我使用 CORS 时,AngularJS $http 似乎没有正确响应

从 ExtJS 向 node.js 请求时出现 CORS 问题。请求或响应标头不正确?

从帖子正文读取时,AWS API 网关 CORS 错误