URL哈希在重定向之间保持不变

chi*_*fet 35 url hash redirect http fragment

出于某种原因,非IE浏览器似乎在发送服务器端重定向(使用Location头)时保留URL哈希(如果存在).例:

// a simple redirect using Response.Redirect("http://www.yahoo.com");
Text.aspx
Run Code Online (Sandbox Code Playgroud)

如果我访问:

Test.aspx#foo
Run Code Online (Sandbox Code Playgroud)

在Firefox/Chrome中,我被带到:

http://www.yahoo.com#foo
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会这样?我已经在不同的平台上尝试了各种服务器端重定向(虽然所有这些都导致了Location头),但这似乎总是发生.我没有在HTTP规范中看到它,但它似乎确实是浏览器本身的问题.URL哈希(如预期的那样)永远不会发送到服务器,因此服务器重定向不会被它污染,浏览器只是出于某种原因持久化它.

有任何想法吗?

Ben*_*Ben 73

我建议这是正确的行为.302和307状态代码表示资源可在其他地方找到.#bookmark是资源中的位置.

找到资源(html文档)后,浏览器就可以#bookmark在文档中找到它.

这个比喻是这样的:你想在第57章的书中查找一些东西,所以你去图书馆拿到这本书.但是书架上有一张纸条说这本书已经移动了,它现在在另一栋楼里.所以你去了新的位置.你仍然想要第57章 - 你得到这本书的地方无关紧要.

  • 但是,您可以在"Location"标题中发送一个显式锚点.像`http:// www.yahoo.com#`这样的东西 (4认同)
  • @Ben IE8不会使用哈希重定向.我希望它重定向.有任何想法吗? (3认同)

Gum*_*mbo 24

这是以前的HTTP规范未涵盖的一个方面,但已在后面的HTTP开发中解决:

如果服务器返回响应代码300("多选"),301("永久移动"),302("暂时移动")或303("看到其他"),并且服务器还返回一个或多个URI在可以找到资源的地方,客户端应该对新的URI进行处理,就好像最后添加了原始URI的片段标识符一样.

例外情况是返回的URI已经具有片段标识符.在这种情况下,不得将原始片段标识符添加到其中.

因此,原始URI的片段也应该用于重定向URI,除非它还包含片段.

虽然这只是2000年到期的草案,但似乎上述行为是当今Web浏览器中事实上的标准行为.

@Julian Reschke@Mark Nottingham可能对此有更多/更好的了解.