HTTP重定向代码之间的区别

Cha*_*l72 143 redirect uri http http-status-codes

各种HTTP 3XX重定向代码之间的差异对我来说并不清楚.是的,我已经阅读了规范,但这里的标准和实际做法之间似乎存在一些差异.

301重定向代码似乎很清楚:这意味着资源已被永久移动到另一个URI,以及将来的请求应使用URI.

并且307重定向代码似乎也很清楚:这意味着重定向是临时的,未来的请求仍然应该使用原始URI.

但我不能告诉区别是什么之间302303,或者为什么他们中有谁真正从不同的301.它似乎302本来是一个临时重定向,(比如307),但在实践中,大多数浏览器都把它当成了一个303.但是a 303和a 之间有什么区别301?是301应该意味着重定向是永久的吗?

Bob*_*man 128

  • 301:永久重定向.对此资源发出后续请求的客户端应使用新URI.客户应不会自动执行重定向的POST/PUT/DELETE请求.
  • 302:重定向未定义的原因.客户端使这一资源应该后续请求使用新的URI.客户应不会自动执行重定向的POST/PUT/DELETE请求.
  • 303:重定向未定义的原因.通常,'行动已经完成,继续在其他地方.客户端使这一资源应该后续请求使用新的URI.客户端遵循POST/PUT/DELETE请求的重定向,但使用GET作为后续请求.
  • 307:临时重定向.资源可能稍后返回此位置.对此资源发出后续请求的客户端应使用旧URI.客户应不会自动执行重定向的POST/PUT/DELETE请求.

如果您有选择,我个人建议避免使用302.许多客户在遇到302时都不遵守规范.对于临时重定向,您应该使用303或307,具体取决于您对非GET请求的行为类型.除非您需要POST/PUT/DELETE上的备用行为,否则首选307到303.

  • 不.在303之后需要将方法重写为GET.其他人需要保留方法,但是如果方法不安全则要与UA确认(因此OPTIONS,HEAD,GET,PROPFIND等方法除外) (26认同)
  • @BobAman在您的描述中,您在原始HTTP规范([RFC 1945](http://tools.ietf.org/html/rfc1945))中犯了同样的错误.例如,*客户端应该遵循POST/PUT/DELETE请求的重定向.*303重定向后**没有**指定在以下请求中使用的http动词必须是GET是误导性的... (7认同)
  • 纠正自己:"遵循303要求将方法重写为GET,除非初始方法是HEAD". (2认同)
  • Piotr:默认值应该是*not*来修改方法; 移动的资源,不影响如何操纵它.303是一个例外; 它并不意味着"资源已经移动",而是"处理了请求,这是您的结果"; 这是一种完全不同的重定向类型.见http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-17.html#status.3xx (2认同)
  • 由于@BobAman 拒绝将 JulianReschke 的更正整合到他的答案中,我介入整合它。顺便说一句,我仍然认为 GolezTrol 的回答更准确(/sf/answers/333513141/)。不幸的是,他的答案从来没有赶上成为最佳答案,所以我决定除了支持更好的答案之外,还要修正更糟糕的答案。 (2认同)
  • 目前尚不清楚“客户端不应自动遵循 POST/PUT/DELETE 请求的重定向”。确实是 302/307 描述中的意思。那么客户应该做什么呢?就忽略响应代码​​吗?询问用户确认?还有别的事吗?同样重要的是要提到的是,在大多数 http 客户端中,302 实际上是通过 303 而不是 307(如规范和此答案所述)的行为来实现的(恕我直言,说“不遵循规范”是不够的),这就是为什么 2引入了新代码(303 和 307),而不仅仅是一个补充 302 的代码。 (2认同)

Gol*_*rol 79

303和307之间的区别是:

303:见其他.请求已正确接收,但应使用重定向网址上的GET检索结果.

307:临时重定向.应将整个请求重定向到新网址.任何帖子数据都应该重新发布.

请注意,302的行为是307,但大多数浏览器将其实现为303的行为(当时两者都不存在).因此,引入了这两个新代码来代替302.

301和303之间的区别:

301:移动文档.未来的请求应该使用新的URL.这个网址已经过时了.

注意:请注意此代码.浏览器和代理往往会在其上应用非常激进的缓存,因此如果您使用301回复,则可能需要很长时间才能重新访问该网址.

303:正确接收请求.处理任何PUT请求.将生成的文档可以从重定向URL来检索.未来的请求仍应转到原始网址.