在302重定向后,Safari失败了CORS请求

flo*_*pin 8 javascript safari ajax cors http-status-code-302

我对Safari处理CORS请求的方式有疑问.考虑以下场景:

  1. DomainA托管一个页面,该页面向DomainB发出XHR请求(原始标头设置为DomainA)
  2. DomainB返回302重定向做DomainC(原始标头设置为null,这似乎与RFC一样)
  3. DomainC返回200响应的实际内容

这适用于Chrome,FF,但它在Safari上失败(在Mozilla/5.0(Macintosh; Intel Mac OS X 10_10_5)AppleWebKit/600.8.9(KHTML,如Gecko)版本/ 8.0.8 Safari/600.8.9上测试).

当我在没有打开xhr.withCredentials的情况下发出请求时,首先,Safari会在向DomainC提出实际请求之前发出OPTIONS预检请求,因为所有请求都是简单请求,但我可以处理这个请求.问题是Safari在对DomainC的预检请求说"无法从null发出任何请求"后失败.我可以通过将Access-Control-Allow-Origin设置为*并删除Access-Control-Allow-Credentials标头(这些是互斥的)来绕过这一点,这将使这种情况起作用.但是我仍然认为这不是正确的行为.

现在,事情是我需要传递凭据(并且不,我不能以其他方式传递它,因为它依赖于某些第三方服务器).那么,让我们来吧

xhr.withCredentials

为true,我们回到"无法从null发出任何请求",现在甚至通配符访问控制允许凭证也无济于事.

我认为所有CORS标头都设置正确,但请随时查看我.测试示例可以在这里找到:http://a.ihatesafari.com

这里发生了什么?这是一个错误还是我错过了什么?

谢谢你的回答

小智 3

我也遇到这个问题并发现了这个bug似乎正在描述它。在 FF / Chrome / Safari 中运行 bug 中引用的测试代码仅在 Safari 中产生失败。看来这个bug还没有被修复。

最终为了解决这个问题,我修改了 HTTP API,添加了一个可选的查询参数来触发不同的响应,该响应返回 200 OK,其中包含客户端要遵循的 url 的 JSON 正文。不幸的是,如果您是其他人的 HTTP API 的使用者,这不会有太大帮助。