每当 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
Angular 跨域请求 CORS 失败,但节点 http.get() 成功返回
当我使用 CORS 时,AngularJS $http 似乎没有正确响应