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

Kyl*_*yle 51 http-status-codes http-status-code-302

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

似乎大多数Web应用程序使用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?

Kor*_*nel 57

正确的是303.

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

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

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

  • 虽然303在技术上是正确的(并且是我使用的),现代浏览器(我刚刚在Chrome 26上尝试过它)*仍然*不遵循针对POST的302响应的规范,所以它似乎在现代网络302 = == 303. (5认同)

Cra*_*lus 21

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

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

  • 请记住,这个建议是从1999年开始的. (49认同)
  • @Mikaveli代理不执行重定向,因此这是无关紧要的.它只对UA很重要,如果你支持NN4/IE4,那么303状态是你问题中最少的:) (10认同)
  • @Mikaveli在最坏的情况下只是将响应标记为不可缓存?我真的怀疑人们会容忍一个如此破碎的代理人.缓存临时重定向会破坏许多网站(可能在登录之前/之后有重定向的任何内容). (5认同)
  • 是的,但我仍然经常发现(通常是公司的)代理不完全符合1.1.我也谨慎对待. (2认同)

Boz*_*zho 9

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

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

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

  • 是的,我不知道PHP的`header()`除了发送给定的头数据之外还会做一些伏都教.与文档一起检查,+1表示提升 (3认同)
  • 和ExpressJS`res.redirect(url)`默认使用302 (2认同)

Car*_*rós 6

从理论上讲,您(以及全世界)应该使用303。而且,大多数浏览器对302的反应就像对303的反应一样。因此,总的来说,发送302或303似乎无关紧要。在为303规范提供的链接中,有一个有趣的注释:

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

请注意-HTTP / 1.1之前的用户代理,这一点很重要,因此也许一阵子很重要,但我不认为现在是这种情况。

因此,总而言之,这取决于您(我敢打赌,您希望浏览器永远不会针对302个状态更改其行为,因为担心会破坏用户的互联网)。


Alf*_*ton 5

当提供 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

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