代码为3xx且空“位置”标头的HTTP响应

时间:2014-01-23 14:57:20

标签: java http httpurlconnection http-redirect

我正在使用Java(HttpURLConnection)连接到URL。

我注意到在某些情况下,响应代码为3xx,但“位置”标题为空。

客户端浏览器在收到此类HTTP响应后如何知道重定向的位置?

由于

3 个答案:

答案 0 :(得分:3)

并非所有3xx回复都可以自动重定向。

300在响应正文中提供了多个网址,而不是Location标题中的网址。客户/用户必须决定接下来要检索哪一个。

仅当下一个网址已知时,

301302303307才会提供Location。否则,客户/用户必须决定下一步该做什么。

304不是重定向。它是对条件GET的响应,其中请求的内容自上次满足请求的条件以来未发生更改。

305始终为所需的代理提供Location以进行连接。

306不再使用了。

答案 1 :(得分:1)

如果您查看某些3xx状态代码的HTTP spec,其中一些仅应该提供Location标头。

  

客户端浏览器收到此消息后如何知道重定向的位置   那种HTTP响应?

没有。由客户来决定在这种情况下要做什么。

答案 2 :(得分:0)

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标头)时,它都不会重定向,而是显示响应正文。当用户禁用自动重定向时,这也适用。因此,响应主体还应包括相应的链接。

空位置标头可能显然会引入重定向循环。不过,状态代码303 See Other可以与空的Location标头结合使用,以使用完全相同的URI实现Post/Redirect/Get习惯用法。此惯用语可防止用户在重新加载页面时使用POST重新提交相同的表单,因为303 See Other要求用户代理在遵循新位置时必须使用GET请求方法。 301 Moved Permanently302 Found也可以将请求方法更改为GET(但也可以不更改); 307 Temporary Redirect308 Permanent Redirect永远不会更改请求方法。

虽然这个用例看起来很优雅,但我不建议实施它,因为浏览器的支持有所不同。