4

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

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

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

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

4

3 回答 3

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字段应该是一个完整的 URL。在实践中这并不重要——浏览器是宽容的——但如果你关心规格,那是正确的做法。

于 2008-11-07T23:50:14.253 回答
4

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

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

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

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

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

于 2008-11-07T23:27:27.340 回答
1

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

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

于 2008-11-07T23:44:54.183 回答