功能重定向的HTTP状态

时间:2008-11-07 23:19:53

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

现在我们已经有了显示UI元素的网页,以及只处理表单提交的网页,然后重定向回UI页面。他们使用PHP的header()函数执行此操作:

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

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

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

3 个答案:

答案 0 :(得分:8)

您可以使用其中任何一个,但用于重定向后的正确状态代码为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字段应为完整网址。在实践中它并不重要 - 浏览器是宽容的 - 但如果你关心规范,这是正确的事情。

答案 1 :(得分:4)

我自己从未使用过它......正如你在链接中所说的那样:

  

注意:许多pre-HTTP / 1.1用户代理都这样做   不明白303         状态。当与这样的客户端的互操作性是一个问题时,         因为大多数用户代理会做出反应,所以可以使用302状态代码         如此处针对303所述的302响应。

这似乎足以让我坚持使用302。

FYI header()需要额外的参数来设置状态代码:

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

答案 2 :(得分:1)

为了扩展RoBorg的答案,许多浏览器不了解多个HTTP响应代码中的少数几个。

附注:你完全关心搜索引擎的位置,302s可以(据说)导致问题。