POST后,我应该做一个302或303redirect?

Web应用程序的一个常见情况是在修改数据库的POST之后redirect。 就像在用户创build后redirect到新创build的数据库对象一样。

似乎大多数Web应用程序都使用302redirect,但是如果您希望redirect中指定的URL可以使用GET来获取,那么按照规范进行操作似乎是正确的。 从技术上讲,使用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?

依靠。
在HTTP1.1中添加了303和307个响应。
因此,严格遵守HTTP1.1 RFC的客户端代理应该可以使用303响应。
但是可能会有代理不完全符合或符合HTTP1.0,将无法处理303。
所以为了确保你的应用程序的响应能够被大多数客户端实现正常处理,我认为302是最安全的select。
摘自RFC-2616 :

注意:许多pre-HTTP / 1.1用户代理不了解303状态。 当与这种客户端的互操作性是一个问题时,可以使用302状态码来代替,因为大多数用户代理响应302响应,如303所述。

正确的是303。

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

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

但是,如果你担心HTTP / 1.0客户端(不支持虚拟主机,并且可能无法访问你的页面),那么你应该在303响应中包含链接到新页面的HTML像Apache这样的networking服务器已经这样做了)。

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

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

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

从理论上讲,你(和全世界)应该像你所说的那样使用303。 但是,大多数浏览器都会对302做出反应,就像他们应该对303做出反应一样。总的来说,如果你发送了302或303,这似乎并不重要。在你为303规范提供的链接中,有一个有趣的注释:

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

重要的是要注意pre- HTTP / 1.1用户代理,所以也许这很重要,但是现在我不相信这是事实。

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

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

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浏览器可能不会redirect到新的URL, 用户必须跟随一个链接才能到达新的项目(这个链接可以在响应的主体以及位置标题中提供)。