Redirect URL片段和302重定向

Redirect URL片段和302重定向,redirect,fragment-identifier,http-redirect,Redirect,Fragment Identifier,Http Redirect,众所周知,URL片段(在#之后的部分)不会发送到服务器 我确实想知道,当涉及服务器重定向(通过HTTP状态302和位置:头)时,片段是如何工作的 我的问题有两个方面: 如果原始URL有一个片段(/original.php#foo),并且重定向到/new.php,那么原始URL的片段部分会丢失吗?或者它有时会应用到新的URL在这种情况下,新的URL是否会是/new.php#foo 不管原始URL是什么,如果服务器重定向到一个带有片段的新URL(/new.php#foo),该片段会得到“尊重”吗?或

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

我确实想知道,当涉及服务器重定向(通过HTTP状态302和
位置:
头)时,片段是如何工作的

我的问题有两个方面:

  • 如果原始URL有一个片段(
    /original.php#foo
    ),并且重定向到
    /new.php
    ,那么原始URL的片段部分会丢失吗?或者它有时会应用到新的URL
    在这种情况下,新的URL是否会是
    /new.php#foo

  • 不管原始URL是什么,如果服务器重定向到一个带有片段的新URL(
    /new.php#foo
    ),该片段会得到“尊重”吗?或者服务器真的不需要干涉片段吗?浏览器会因此忽略它,只需转到
    /new.php


  • 更新2014-6-27

    ,已作为建议标准发布。从:

    位置标头字段的语法已更改为允许所有 URI引用,包括相对引用和片段,以及 并澄清何时不允许使用碎片 适当的(第7.1.2节)

    要点来自:

    如果3xx(重定向)响应中提供的位置值 如果没有片段组件,则用户代理必须处理 重定向,就像值继承URI的片段组件一样 用于生成请求目标(即重定向)的引用 继承原始引用的片段(如果有)

    例如,一个 获取为URI引用生成的请求 “”可能会导致303(请参阅其他) 包含标题字段的响应:

    Location: /People.html#tim
    
    Location: http://www.example.net/index.html
    
    这表明用户代理重定向到 “”

    同样,为URI引用生成GET请求 “”可能会导致301(已移动) (永久)包含标题字段的响应:

    Location: /People.html#tim
    
    Location: http://www.example.net/index.html
    
    这表明用户代理重定向到 ,保留原作 片段标识符

    这应该清楚地回答你的问题

    更新结束

    这是与的开放(未指定)问题。该问题在以下两个问题中解决:

    #6允许在
    位置
    标题中使用片段#43说:

    我刚刚用各种浏览器测试了这个

    • Firefox和Safari使用位置标题中的片段
    • Opera使用源URI中的片段(如果存在),否则使用重定向位置中的片段
    • IE(8)忽略位置URI中的片段,因此将使用源URI中的片段(如果存在)
    提议:

    “注意:需要组合原始URI和重定向中的片段标识符时的行为未定义;当前用户代理在哪个片段优先上确实存在差异。”

    [……]

    看起来IE8确实使用了
    位置
    中的片段idenfitier(我看到的行为可能仅限于localhost)

    因此,我们似乎对Safari/IE/Firefox/Chrome(刚刚测试过)具有一致的行为,即使用位置头中的片段,而不管原始URI是什么

    因此,我改变我的提议,将其记录为预期行为

    这将为您的问题提供最具浏览器兼容性和未来证明(因为此问题最终将得到标准化)的答案:

    A:原始URL的片段将被丢弃


    B:来自
    位置
    标题的片段将受到尊重。

    如果发生HTTP/3xx重定向,Safari 5和IE9及以下版本将删除原始URI的片段。如果响应上的Location标头指定了一个片段,则将使用该片段

    IE10+、Chrome11+、Firefox4+和Opera都将在3xx重定向后“重新附加”原始URI的片段

    测试页:


    请参阅

    上关于这个问题的进一步讨论,让您知道,在这里,您可以通过w3c定义所有人的行为方式来找到合适的规范:-第4.1条-见下文:

    当资源(URI1)移动时,HTTP重定向可以指示其位置 新位置(URI2)

    如果URI1有一个片段标识符#frag,那么 用户代理应该试图联系的是URI2#frag。如果URI2 已具有片段标识符,则不能追加#frag,并且 新的目标是URI2

    错误:大多数当前用户代理都实现HTTP重定向,但不实现 将片段标识符附加到新的URI,通常 混淆用户,因为他们最终使用了错误的资源

    参考资料:

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

    假设一个用户请求位于的资源 并且服务器重定向 用户代理到。在拿到后者之前 URI时,浏览器应附加片段标识符#更改:

    我面临着类似的问题

    希望它能帮助那些有类似要求的人,在IE中为302重定向保存哈希

    添加答案的重要部分,而不仅仅是链接 我们在应用程序中使用
    SiteMinder
    身份验证

    我发现在成功的身份验证之后,
    SiteMinder
    正在使用
    302重定向到用户请求的应用程序页面<