首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >URL片段和302重定向

URL片段和302重定向
EN

Stack Overflow用户
提问于 2010-02-18 12:55:29
回答 4查看 55.7K关注 0票数 148

众所周知,URL片段(#之后的部分)不会发送到服务器。

我想知道当涉及到服务器重定向(通过HTTP status 302和Location:头)时,片段是如何工作的。

我的问题实际上有两个方面:

  1. 如果原始URL有一个片段(/original.php#foo),并且重定向到/new.php,那么原始URL的片段部分会丢失吗?或者它有时会应用于新的URL?

如果服务器重定向到一个带有片段(/new.php#foo)的新的case?

  • Regardless,那么这个片段会被“尊重”吗?或者,服务器真的根本不需要干涉片段吗?浏览器会因此通过简单地转到/new.php??

而忽略它吗

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-21 20:57:31

更新2014-6月27日

RFC 7231, Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content,已作为建议标准发布。从Changelog

位置标头字段的语法已更改,以允许所有URI引用,包括相对引用和片段,同时还澄清了何时不适合使用片段。(第7.1.2节)

来自Section 7.1.2. Location的要点

如果3xx (重定向)响应中提供的位置值没有片段组件,则用户代理必须处理重定向,就好像该值继承了用于生成请求目标的URI引用的片段组件(即,重定向继承了原始引用的片段(如果有的话))。例如,为URI引用"http://www.example.org/~tim“生成的GET请求可能会导致包含头字段的303 (请参阅其他)响应:

位置: /People.html#tim

它建议用户代理重定向到"http://www.example.org/People.html#tim“。

同样,为URI引用"http://www.example.org/index.html#larry“生成的GET请求可能导致包含头字段的301 (永久移动)响应:

位置:http://www.example.net/index.html

其建议用户代理重定向到"http://www.example.net/index.html#larry"“,保留原始片段标识符。

这应该可以清楚地回答您的问题。

更新结束

这是current HTTP specification的一个开放(未指定)问题。在IETF httpbis working group的两期中对此进行了讨论

#6允许在Location报头中包含片段。#43说:

我刚刚在不同的浏览器上测试了这一点。

  • Firefox和Safari使用位置中的片段当存在时使用来自源URI的片段,否则来自重定向位置
  • IE (8)的片段忽略位置URI中的片段,因此当存在

时将使用来自源URI的片段

Proposal:“注意:来自原始URI的片段标识符和重定向需要组合的行为是未定义的;当前的用户代理确实在哪个片段优先的问题上存在差异。”...看起来IE8确实使用了与Location相同的片段(我看到的行为可能仅限于本地主机)。因此,我们似乎对Safari/IE/Firefox/Chrome (刚刚测试的)具有一致的行为,因为无论原始URI是什么,都会使用Location头中的片段。因此,我更改了我的建议,将其记录为预期行为。

这将导致最兼容的浏览器和未来的证据(因为这个问题最终将得到标准化)对您的问题的答案:

A:来自原始URL的片段被丢弃。

B:接受来自Location标头的片段。

票数 146
EN

Stack Overflow用户

发布于 2011-05-07 02:11:29

如果发生HTTP/3xx重定向,Safari5和IE9及更低版本会丢弃原始URI的片段。如果响应上的Location标头指定了一个片段,则使用该片段。

IE10+、Chrome 11+、火狐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

票数 46
EN

Stack Overflow用户

发布于 2012-07-02 01:23:12

只想让你知道,你可以在这里找到合适的规格。由w3c定义所有人的行为方式:http://www.w3.org/TR/cuap#uri -第4.1条-见下文:

当资源(URI1)已移动时,

重定向可以指示其新位置(URI2)。

如果URI1有一个片段标识符#frag,那么用户代理应该尝试到达的新目标应该是URI2#frag。如果URI2已经有了片段标识符,则不能附加#frag,并且新目标为URI2。

错误:大多数当前的用户代理确实实现了HTTP重定向,但没有将片段标识符附加到新的URI,这通常会使用户感到困惑,因为它们最终得到了错误的资源。

参考文献:

HTTP重定向在HTTP1.1规范RFC2616的第10.3节中进行了描述。所需的行为在“处理重定向RURL中的片段标识符”RURL中详细描述。术语“永久统一资源定位符(PURL)”表示通过HTTP重定向指向另一个URL的URL(URI的特例)。有关更多信息,请参阅“持久统一资源定位器”PURL。示例:

假设用户在http://www.w3.org/TR/WD-ruby/#changes请求资源,服务器将用户代理重定向到http://www.w3.org/TR/ruby/。在获取后一个URI之前,浏览器应该将片段标识符#changes附加到它后面:http://www.w3.org/TR/ruby/#changes.

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2286402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档