在302重定向

时间:2015-09-01 13:27:40

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

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

  1. DomainA托管一个向DomainB发出XHR请求的页面(原始标头设置为DomainA)
  2. DomainB返回302重定向做DomainC(原始标头设置为null,这似乎与RFC一致)
  3. DomainC以实际内容返回200回复​​
  4. 这适用于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的预检请求后失败了#34;无法从null"发出任何请求。 我可以通过将Access-Control-Allow-Origin设置为*并删除Access-Control-Allow-Credentials标头(这些是互斥的)来绕过这一点,这将使这种情况起作用。但是我仍然认为这不是正确的行为。

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

    xhr.withCredentials

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

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

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

    感谢您的回答

1 个答案:

答案 0 :(得分:3)

我也遇到了这个问题,发现2012年的this bug似乎在描述它。运行FF / Chrome / Safari中的错误中引用的测试代码仅在Safari中出现故障。看起来该bug还没有修补。

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