2022-09-22更新:
RFC 9110/STD 97 HTTP语义(取代7231等其他标准)已于2022年6月发布为INTERNET标准。新编号的
第10.2.2节Location的措辞与之前/以下相同。
2014-Jun-27更新:
RFC 7231,超文本传输协议(HTTP / 1.1):语义和内容,已作为建议标准发布。从
更改日志中可以看出:
引用:
Location头字段的语法已更改以允许所有URI引用,包括相对引用和片段,在何时使用片段不适当方面进行了一些澄清。(第7.1.2节)
第7.1.2节Location中的重要点:
引用:
如果3xx(重定向)响应中提供的Location值没有片段组件,则用户代理必须将重定向的处理视为该值继承用于生成请求目标的URI引用的片段组件(即,如果有原始引用的片段,则重定向会继承原始引用的片段)。
引用:
例如,为URI参考“http://www.example.org/~tim”生成的GET请求可能导致包含标题字段的303(See Other)响应:
Location: /People.html
这说明用户代理应该重定向到“http://www.example.org/People.html#tim”。
同样,对于URI引用“http://www.example.org/index.html#larry”生成的GET请求可能会导致301(永久移动)响应,其中包含头字段:
Location: http://www.example.net/index.html
这表明用户代理应重定向到“http://www.example.net/index.html#larry”,保留原始片段标识符。
这应该清楚地回答了你的问题。
更新结束
这是当前HTTP规范中未指定的问题。在IETF httpbis工作组的2个问题中进行了解决:
#6 允许在 Location
标头中使用片段标识符。 #43说:
我用各种浏览器进行了测试。
- Firefox和Safari使用位置标头中的片段标识符
- Opera使用源URI中的片段(如果存在),否则使用重定向位置的片段
- IE(8)忽略位置URI中的片段标识符,因此将使用源URI中的片段标识符(如果存在)
提案:
“注意:当需要组合原始URI和重定向的片段标识符时,其行为未定义;当前的用户代理确实不同意哪个片段具有优先权。”
[...]
看起来IE8确实使用了Location的片段标识符(我所看到的行为可能仅限于本地主机)。
因此我们似乎对Safari / IE / Firefox / Chrome(刚测试)具有一致的行为,即使用Location标头中的片段标识符,无论原始URI是什么。
因此,我更改我的建议以记录该作为预期行为。
这导致了最兼容浏览器和未来证明正确(因为这个问题最终会被标准化)的回答:
A: 原始URL的片段标识符被丢弃。
B: 使用 Location
标头的片段标识符。