55

Web 应用程序的一个常见场景是在修改数据库的 POST 之后重定向。就像在用户创建它之后重定向到新创建的数据库对象一样。

似乎大多数网络应用程序都使用 302 重定向,但如果您希望使用 GET 获取重定向中指定的 url,则根据规范,303 似乎是正确的做法。从技术上讲,对于 302,浏览器应该使用与获取原始 url 相同的方法来获取指定的 url,即 POST。大多数浏览器都不会这样做。

302 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3

303 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4

那么我应该使用 302 还是 303?

4

5 回答 5

59

正确的是303。

我使用它并没有发现任何与比 Netscape 4(1998 年,17 年前发布)更新的 UA 的兼容性问题。

如果您使用 302,您将面临 UA 将重新发送 POST 到新 URL 而不是切换到 GET 的风险。

尽管如此,如果您担心 HTTP/1.0 客户端(它们不支持虚拟主机并且可能无论如何都无法访问您的页面),那么您应该在 303 响应的正文中包含指向新页面的链接的 HTML(像 Apache 这样的 Web 服务器已经这样做了)。

于 2011-07-22T10:03:43.387 回答
22

依靠。
HTTP1.1 中添加了 303 和 307 响应。
因此,严格遵守 HTTP1.1 RFC 的客户端代理应该可以使用 303 响应。
但是可能存在不完全符合或符合 HTTP1.0 且无法处理 303 的代理。
因此,为了确保大多数客户端实现可以优雅地处理您的应用程序的响应,我认为 302 是最安全的选择。
摘自RFC-2616

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

于 2011-02-26T19:13:26.790 回答
9

在大多数服务器端语言中,默认重定向机制使用 302:

  • Javaresponse.sendRedirect(..)使用 302
  • ASP.NETresponse.Redirect(..)使用 302
  • PHPheader("Location: ..")使用 302
  • RoRredirect_to使用 302
  • ETC..

所以我更喜欢这个,而不是手动设置状态和标题。

于 2011-02-26T19:15:32.883 回答
6

理论上,您(以及全世界)应该使用 303,正如您所指出的那样。而且,大多数浏览器对 302 的反应就像它们应该对 303 做出反应一样。所以,总的来说,发送 302 或 303 似乎并不重要。在您为 303 规范提供的链接中,有一个有趣的注释:

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

重要的是要注意HTTP/1.1之前的用户代理,所以也许这在不久前很重要,但我不相信现在是这样。

所以,总而言之,这取决于你(我可以打赌,无论你想要什么,浏览器都不会改变他们对 302 状态的行为,因为他们害怕破坏他们的用户的互联网)。

于 2011-02-26T19:14:25.067 回答
4

当提供由 POST 请求创建的新资源的位置时,201(“已创建”)是一个适当的响应。

HTTP/1.1:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2

Atom 发布协议:https ://www.rfc-editor.org/rfc/rfc5023#section-5.3

不过,这确实意味着 Web 浏览器可能不会重定向到新 URL;用户必须点击一个链接才能到达新项目(此链接可以在响应的正文中提供,也可以在 Location 标头中提供)。

于 2012-05-08T09:59:23.733 回答