我正在使用Java(HttpURLConnection
)连接到URL。
我注意到在某些情况下,响应代码为3xx,但“位置”标题为空。
客户端浏览器在收到此类HTTP响应后如何知道重定向的位置?
由于
答案 0 :(得分:3)
并非所有3xx
回复都可以自动重定向。
300
在响应正文中提供了多个网址,而不是Location
标题中的网址。客户/用户必须决定接下来要检索哪一个。
301
,302
,303
和307
才会提供Location
。否则,客户/用户必须决定下一步该做什么。
304
不是重定向。它是对条件GET的响应,其中请求的内容自上次满足请求的条件以来未发生更改。
305
始终为所需的代理提供Location
以进行连接。
306
不再使用了。
答案 1 :(得分:1)
答案 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 Permanently
和302 Found
也可以将请求方法更改为GET(但也可以不更改); 307 Temporary Redirect
和308 Permanent Redirect
永远不会更改请求方法。
虽然这个用例看起来很优雅,但我不建议实施它,因为浏览器的支持有所不同。