HTTP 302重定向到CORS请求被浏览器删除

时间:2015-03-07 17:01:41

标签: cors http-redirect

我正在使用网站A中的一些javascript加载HTML页面。

Javascript向站点B发送HTTP GET请求。此时:      
- 浏览器向站点B发送OPTIONS请求     
- 站点B响应OPTIONS请求     
- 然后浏览器将原始HTTP GET请求发送到站点B.     
- 站点B使用HTTP 302进行响应,并将位置设置为站点C.

此时,浏览器停止处理请求。我期待它将HTTP OPTIONS请求发送到站点C,就像它向站点B发送请求时那样。但事实并非如此。我在Firefox和Chrome上观察到了相同的行为。

我想了解为什么浏览器会以这种方式运行。我知道应该有一些检查或最大重定向来防止循环,但不限制2个重定向请求。

此外,为什么标题信息不会发送到Javascript代码,以便应用程序可以对其执行某些操作。它只是被浏览器删除了,虽然它通过在浏览器控制台中显示带有位置URL的站点C的HTTP 302响应来取笑你。

XMLHttpRequest无法加载https://siteB/ ...请求被重定向到“https://siteC/ ..”,这对于需要预检的跨源请求是不允许的。

对设计的任何见解都深表感谢。

此致

2 个答案:

答案 0 :(得分:26)

好吧,我遇到了同样的问题,不幸的是,这种行为很正常,according to W3C spec

此规范描述了浏览器关于CORS作为机器状态的行为,如果你跳到第3步(执行实际请求),它会明确指出:

  

这是实际的请求。应用make a request步骤并观察   提出请求时请求规则如下。

     

如果响应的HTTP状态代码为301,302,303,307或308   应用缓存和网络错误步骤。

因此,如果我理解正确,我们不能指望浏览器在CORS的情况下自动遵循重定向(据推测,因为OPTION已授予对其他资源的访问权限?但为什么不自动发送另一个OPTION请求这个资源?)。

更糟糕的是,由于上述原因导致自动重定向失败后浏览器隐藏了响应的标题,我们无法访问Location标头来处理后续调用自己纠正资源。因此在这种情况下无法获取实际资源。

我认为这是一个错误,但我无法在网络上找到关于这个主题的任何好帖子。

如果可能的话,一种解决方法是不执行CORS请求,而是使用简单的请求(根据规范再次,例如没有自定义标头的简单GET),这不会导致任何预检请求发送:在这种情况下,重定向正常工作(浏览器自动跟随)。

否则,您可以看到是否可以调整服务器以便在发出CORS类型的请求时不响应302,而是使用您可以在客户端中识别的自定义HTTP代码进行响应,以包含重定向位置。允许客户手动关注的响应内容。

如果有人有关于此行为原因的任何有效信息,请提供您的意见: - )

希望它有所帮助。

答案 1 :(得分:-1)

我不能保证我的答案对你的情况有用。

我的客户请求由cosign重定向;因此,我在Access-Control-Allow-Origin中有cosign url。它对我有用。另外,在客户端AJAX中添加xhrFields withCredentials。

 $.ajax( {url:url, success:function(result){   alert(result.toString()); } 
 ,xhrFields: {withCredentials: true}

.NET服务器的SupportsCredentials = true

 [EnableCors(origins: "https://cosign_URL", headers: "*"
    , methods: "get,post", SupportsCredentials = true)]