我正在使用Java(HttpURLConnection
)连接到URL。
[我已经注意到,在某些情况下,响应代码为3xx,但是'Location'标头为空。
客户端浏览器在收到这种HTTP响应后如何知道重定向到哪里?
谢谢
并非所有3xx
回复都可以自动重定向。
300
在响应正文中提供多个URL,而不是在Location
标头中提供。客户/用户必须决定下一步要检索哪个。
301
,302
,303
和307
仅在知道下一个URL的情况下才提供Location
。否则,客户/用户必须决定下一步要做什么。
304
不是重定向。这是对有条件GET的响应,其中自上次满足所请求的条件以来,所请求的内容没有更改。
[305
总是向需要连接的代理提供Location
。
306
不再使用。
如果您查看某些3xx状态代码上的HTTP spec,则其中一些仅SHOULD提供Location
标头。
客户端浏览器在收到此信息后如何知道重定向到哪里哪种HTTP响应?
不是。在这种情况下,应由客户端来处理。
位置标头重定向用户代理以与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
从不更改请求方法。
虽然此用例看起来很优雅,但我不建议您实施它,因为浏览器的支持有所不同。