【问题标题】:Safari fails CORS request after 302 redirectSafari 在 302 重定向后失败 CORS 请求
【发布时间】:2015-11-26 18:24:55
【问题描述】:

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

  1. DomainA 托管一个向 DomainB 发出 XHR 请求的页面(源标头设置为 DomainA)
  2. DomainB 返回 302 重定向 do 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

为真,我们又回到“无法从 null 发出任何请求”,现在即使是通配符 Access-Control-Allow-Credentials 也无济于事。

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

这里发生了什么?是错误还是我遗漏了什么?

感谢回答

【问题讨论】:

  • 在更简单的 DomainA 向 DomainA 生成 XHR 并重定向到 DomainC 的情况下,它甚至会失败。

标签: javascript ajax safari cors http-status-code-302


【解决方案1】:

我也遇到了这个问题,发现 this bug 从 2012 年开始似乎正在描述它。在 FF / Chrome / Safari 中运行错误中引用的测试代码仅在 Safari 中产生故障。貌似这个bug还没有修复。

最终为了解决这个问题,我修改了我们的 HTTP API 以添加一个可选的查询参数来触发一个不同的响应,该响应返回一个 200 OK 并带有一个包含客户端要遵循的 url 的 JSON 正文。不幸的是,如果您是其他人的 HTTP API 的消费者,这将无济于事。

【讨论】:

  • 我在调用第三方 API 时遇到了这个问题。关于如何解决(或解决)这个问题的任何想法?
  • 如果您有自己的网络服务器/API,您或许可以使用您在服务器上实现的调用来包装第三方 API 调用,该调用以 Safari 可以使用的方式运行。
猜你喜欢
  • 2014-09-10
  • 2017-02-14
  • 2016-05-03
  • 2020-10-15
  • 2014-10-19
  • 2013-02-12
  • 2014-08-22
  • 2022-12-16
  • 2016-07-26
相关资源
最近更新 更多