HTTP响应,代码3xx,'Location'标头为空

问题描述 投票:1回答:3

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

[我已经注意到,在某些情况下,响应代码为3xx,但是'Location'标头为空。

客户端浏览器在收到这种HTTP响应后如何知道重定向到哪里?

谢谢

java http httpurlconnection http-redirect
3个回答
3
投票

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

300在响应正文中提供多个URL,而不是在Location标头中提供。客户/用户必须决定下一步要检索哪个。

301302303307仅在知道下一个URL的情况下才提供Location。否则,客户/用户必须决定下一步要做什么。

304不是重定向。这是对有条件GET的响应,其中自上次满足所请求的条件以来,所请求的内容没有更改。

[305总是向需要连接的代理提供Location

306不再使用。


1
投票

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

客户端浏览器在收到此信息后如何知道重定向到哪里哪种HTTP响应?

不是。在这种情况下,应由客户端来处理。


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从不更改请求方法。

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

© www.soinside.com 2019 - 2024. All rights reserved.