POST后,我应该进行302还是303重定向?

时间:2011-02-26 19:01:32

标签: http-status-codes http-status-code-302

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

似乎大多数网络应用程序都使用302重定向,但如果您希望使用GET获取重定向中指定的网址,那么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?

5 个答案:

答案 0 :(得分:57)

正确的是303.

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

如果您使用302,则表示UA会将POST重新发送到新网址而不是切换到GET。

尽管如此,如果您担心HTTP / 1.0客户端(它们不支持vhost并且可能无法访问您的页面),那么您应该包含带有指向新页面链接的HTML。 303响应(像Apache这样的网络服务器已经这样做了。)

答案 1 :(得分:19)

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

  

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

答案 2 :(得分:9)

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

  • Java response.sendRedirect(..)使用302
  • ASP.NET response.Redirect(..)使用302
  • PHP header("Location: ..")使用302
  • RoR redirect_to使用302
  • 等。

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

答案 3 :(得分:5)

理论上,您(以及全世界)应该使用303,正如您所指出的那样。但是,大多数浏览器对302做出反应,就像他们应该对303做出反应一样。总的来说,如果你发送302或303似乎没关系。在你为303规范提供的链接中,这是一个有趣的注释:

  

注意:许多pre-HTTP / 1.1用户代理不了解303状态。当需要考虑与此类客户端的互操作性时,可以使用302状态代码,因为大多数用户代理会对302响应做出反应,如此处针对303所述。

重要的是要注意 pre -HTTP / 1.1用户代理,所以也许这在一段时间之前很重要,但我现在不相信。

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

答案 4 :(得分:4)

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

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

Atom发布协议:http://tools.ietf.org/html/rfc5023#section-5.3

这确实意味着Web浏览器可能不会重定向到新的URL;用户必须按照链接转到新项目(此链接可以在响应正文中以及位置标题中提供。)