【问题标题】:HTTP status for functional redirect功能重定向的 HTTP 状态
【发布时间】:2008-11-07 23:19:52
【问题描述】:

现在我们有显示 UI 元素的网页,以及只处理表单提交,然后重定向回 UI 页面的网页。他们使用 PHP 的 header() 函数来做到这一点:

header("Location: /other_page.php");

这会导致发送 302 Found 响应;根据 HTTP 1.1 规范,302 用于“请求的资源临时驻留在不同的 URI 下”的情况。 [HTTP 1.1 spec]

从功能上讲,这很好,但看起来这不是我们正在做的正确的状态代码。看起来 303(“查看其他”)是这里的适当状态,所以我想知道是否有任何理由不使用它。我们必须更明确地使用 header(),因为我们必须指定状态行而不仅仅是 Location: 字段。想法?

【问题讨论】:

    标签: php http post redirect http-status-code-302


    【解决方案1】:

    您可以使用其中任何一种,但用于重定向后发布的正确状态码是 303。

    这种混乱有历史解释。最初,302 指定浏览器不得更改重定向请求的方法。这使得它不适合重定向后发布,您希望浏览器发出 GET 请求。但是,所有浏览器似乎都误解了规范并总是发出 GET 请求。为了消除歧义,HTTP/1.1 指定了两个新代码:303 和 307。303 实质上指定了 302 的事实上的解释,而 307 指定了 302 的原始规范。因此在实践中 302 和 303 是可以互换的,并且在理论302和307是​​。

    如果您真的关心兼容性,302 比 303 更安全,因为 HTTP/1.0 代理可能不理解 303,但所有现代浏览器都使用 HTTP/1.1,所以它不是真正的问题。我建议使用 303,因为这是最正确的做法。

    在旁注; Location 字段应该是完整的 URL。在实践中这并不重要——浏览器是宽容的——但如果你关心规格,那是正确的做法。

    【讨论】:

    【解决方案2】:

    我自己从未使用过它...正如您的链接中所说:

    注意:许多 HTTP/1.1 之前的用户代理都可以 看不懂303 地位。当考虑与此类客户端的互操作性时, 可以使用 302 状态码代替,因为大多数用户代理会做出反应 到 302 响应,如此处针对 303 所述。

    这似乎是我坚持使用 302 的充分理由。

    仅供参考header() 需要额外的参数,您可以在其中设置状态代码:

    header('Location: /foo.php', true, 303);

    【讨论】:

      【解决方案3】:

      为了扩展 RoBorg 的答案,许多浏览器只能理解众多 HTTP 响应代码中的一小部分。

      附注:如果您完全关心搜索引擎的位置,302 可能(据说)会导致问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 2019-08-26
        • 2018-07-04
        • 2013-12-20
        • 2021-12-22
        • 2021-06-08
        • 2012-11-20
        相关资源
        最近更新 更多