【发布时间】:2015-11-26 18:24:55
【问题描述】:
我对 Safari 处理 CORS 请求的方式有疑问。考虑以下场景:
- DomainA 托管一个向 DomainB 发出 XHR 请求的页面(源标头设置为 DomainA)
- DomainB 返回 302 重定向 do DomainC(源头设置为 null,这似乎与 RFC 一致)
- 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
为真,我们又回到“无法从 null 发出任何请求”,现在即使是通配符 Access-Control-Allow-Credentials 也无济于事。
我认为所有 CORS 标头都已正确设置,但请随时检查我。测试示例可以在这里找到:http://a.ihatesafari.com
这里发生了什么?是错误还是我遗漏了什么?
感谢回答
【问题讨论】:
-
在更简单的 DomainA 向 DomainA 生成 XHR 并重定向到 DomainC 的情况下,它甚至会失败。
标签: javascript ajax safari cors http-status-code-302