【发布时间】:2014-02-14 04:58:50
【问题描述】:
我正在使用 Java (HttpURLConnection) 连接到 URL。
我注意到在某些情况下,响应代码是 3xx 但“位置”标头为空。
客户端浏览器收到这种HTTP响应后如何知道重定向到哪里?
谢谢
【问题讨论】:
标签: java http httpurlconnection http-redirect
我正在使用 Java (HttpURLConnection) 连接到 URL。
我注意到在某些情况下,响应代码是 3xx 但“位置”标头为空。
客户端浏览器收到这种HTTP响应后如何知道重定向到哪里?
谢谢
【问题讨论】:
标签: java http httpurlconnection http-redirect
并非所有3xx 回复都可以自动重定向。
300 在响应正文中提供多个 URL,而不是在 Location 标头中。客户/用户必须决定接下来要检索哪一个。
301、302、303 和 307 仅在下一个 URL 已知时才提供 Location。否则,客户/用户必须决定下一步该做什么。
304 不是重定向。它是对条件 GET 的响应,其中请求的内容自上次满足请求的条件以来没有更改。
305 始终为需要连接的代理提供Location。
306 不再使用。
【讨论】:
Location 标头可能被视为有效重定向到最初请求的同一 URI。此外,如果服务器有首选选项,300 响应应该在响应正文中的 URL 之外提供 Location 标头。此外,如果没有 Location 标头,301、302、303、307 和 308 就没有任何意义。
位置标头在与3xx 重定向状态代码一起使用时重定向用户代理以检索另一个URI 引用,304 Not Modified 除外。可以提供绝对 URI 和相对引用,包括引用当前资源的空引用(有关详细信息,请参阅URI specification)。
不过,只有 Firefox 和旧版 Edge 接受空的 Location 标头;新的 Edge 和 Chrome 没有。尽管 HTTP 重定向仅用于重定向到不同的资源或 URI(请参阅RFC 7231 section 6.4),但所有浏览器都实现了显式引用同一页面的非空 Location 标头。
每当用户代理收到重定向状态代码但没有 Location 标头(或无效的 Location 标头或在 Chrome 的情况下为空的 Location 标头)时,它不会重定向但显示响应正文。这也适用于用户禁用自动重定向时。因此,响应正文还应包含相应的链接。
Empty Location 标头显然会引入重定向循环。尽管如此,状态码 303 See Other 可以与空的 Location 标头一起使用,以使用相同的 URI 实现 Post/Redirect/Get 习惯用法。此习惯用法可防止用户在重新加载页面时使用 POST 重新提交相同的表单,因为303 See Other 要求用户代理在关注新位置时使用 GET 请求方法。 301 Moved Permanently 和 302 Found 也可能将请求方法更改为 GET(但也可能不会); 307 Temporary Redirect 和 308 Permanent Redirect 永远不会改变请求方法。
虽然这个用例看起来有点优雅,但我不建议实施它,因为浏览器支持不同。
【讨论】: