众所周知,URL片段( #
之后的部分)不会发送到服务器 .
我确实想知道当涉及服务器重定向(通过HTTP状态302和 Location:
标头)时片段如何工作 .
我的问题实际上是双重的:
-
如果原始URL有一个片段(
/original.php#foo
),并且重定向到/new.php
,那么原始URL的片段部分是否会丢失?或者它有时会应用到新的URL?
在这种情况下,新URL是否会/new.php#foo
? -
无论原始URL如何,如果服务器重定向到带有片段的新URL(
/new.php#foo
),片段是否会获得"honored"?或者服务器真的没有任何业务干扰片段 - 因此浏览器会忽略它,只需转到/new.php
??
3 回答
Update 2014-Jun-27 :
RFC 7231, Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content,已作为建议标准发布 . 来自Changelog:
Section 7.1.2. Location的重点:
这应该清楚地回答你的问题 .
Update END
这是current HTTP specification的开放(未指定)问题 . 它在IETF httpbis working group的2个问题中得到解决:
#6: Fragments allowed in Location
#43: Fragment combination / precedence during redirects
#6允许
Location
标头中的片段 . #43说:这导致了大多数浏览器兼容和未来证明(因为这个问题最终会标准化)回答你的问题:
来自原始URL的 A: 片段将被丢弃 .
来自
Location
Headers 的 B: 片段受到尊重 .如果发生HTTP / 3xx重定向,Safari 5和IE9及更低版本将丢弃原始URI的片段 . 如果响应上的Location标头指定了一个片段,则使用它 .
IE10,Chrome 11,Firefox 4和Opera将在执行3xx重定向后“重新附加”原始URI的片段 .
测试页:http://www.webdbg.com/test/redir/fragment/ .
请参阅http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx进一步讨论此问题
只是为了让您知道,在这里您可以找到合适的规格 . 通过w3c定义所有应该如何表现:http://www.w3.org/TR/cuap#uri - 第4.1条 - 见下文: