【问题标题】:HTTP 302 Redirect to a CORS request is dropped by browsers浏览器丢弃了 HTTP 302 重定向到 CORS 请求
【发布时间】:2015-05-09 03:53:22
【问题描述】:

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

Javascript 向站点 B 发送 HTTP GET 请求。此时:
    - 浏览器向站点 B 发送 OPTIONS 请求
    - 站点 B 响应 OPTIONS 请求
    - 浏览器随后向站点 B 发送原始 HTTP GET 请求
    - 站点 B 响应 HTTP 302 并将位置设置为站点 C。

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

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

还有为什么不将标头信息发送到 Javascript 代码以便应用程序可以对其进行处理。它只是被浏览器删除,尽管它通过在浏览器控制台中显示来自站点 C 的 HTTP 302 响应以及位置 URL 来取笑您。

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

真诚感谢您对设计的任何见解。

问候

【问题讨论】:

标签: cors http-redirect


【解决方案1】:

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

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

这是实际的请求。应用发出请求的步骤并观察 发出请求时遵循以下请求规则。

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

所以,如果我理解正确,我们不能指望浏览器在 CORS 的情况下自动跟随重定向(据说,因为 OPTION 已授予对另一个资源的访问权限?但是为什么不自动向它发送另一个 OPTION 请求资源?)。

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

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

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

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

如果有人有任何关于为什么会出现这种行为的有效信息,请提供您的意见:-)

希望对你有帮助。

【讨论】:

【解决方案2】:

我不能保证我的回答是否适合你的情况。

我的客户请求被 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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-03
    • 2015-11-26
    • 2014-09-10
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2015-04-26
    相关资源
    最近更新 更多