HTTP重定向代码之间的区别


151

我不清楚各种HTTP 3XX重定向代码之间的区别。是的,我已经阅读了规范,但此处的标准和实际做法之间似乎存在一些差异。

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

307重定向代码也似乎很清楚:它意味着重定向是暂时的,将来的请求应该仍然使用原来的URI。

但是我无法分辨302和之间的区别303,或为什么它们中的任何一个真正不同于301。看来302原本是打算将其用作临时重定向(如307),但实际上,大多数浏览器都将其视为303。但是a 303和a有301什么区别?是301应该意味着重定向是永久的吗?

Answers:


139
  • 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。


26
不。遵循303要求将方法重写为GET。遵循其他方法需要保留该方法,但要与UA确认该方法是否不安全(因此,除了OPTIONS,HEAD,GET,PROPFIND之外的其他方法)
Julian Reschke,

1
@JulianReschke您能否在规范中指出支持您声明的地方?
Piotr Dobrogost

7
@BobAman在您的描述中,您正在犯与原始HTTP规范(RFC 1945)中相同的错误。例如,说客户端应遵循POST / PUT / DELETE请求的重定向。303重定向后指定在以下请求中使用的http动词必须为GET就会产生误导性……
Piotr Dobrogost 2011年

2
更正自己:“遵循303要求将方法重写为GET,除非初始方法为HEAD”。
朱利安·雷施克

2
彼得:默认应该是没有修改的方法; 资源移动,这不会影响如何操作它。303是个例外;这并不意味着“资源已经转移”,而是“请求已处理,这就是您的结果”;这是完全不同的重定向类型。参见greenbytes.de/tech/webdav/…–
朱利安·

84

303和307之间的区别是:

303:另见。正确接收到该请求,但是应该使用重定向URL上的GET检索结果。

307:临时重定向。整个请求应重定向到新的URL。任何过帐数据都应重新过帐。

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

301和303之间的区别:

301:文档被移动。以后的请求应使用新的网址。该网址已过时。

注意:请谨慎使用此代码。浏览器和代理倾向于在其上应用真正的攻击性缓存,因此,如果您使用301进行回复,则有人可能需要很长时间才能重新访问该URL。

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


该进入的3XX的细节(以及所有与它的问题),一个好的博客文章是:insanecoding.blogspot.no/2014/02/...
arcuri82

@ skeller88您所做的更改使我的答案不正确,因此我将其还原(对接受更改的人员表示嘘声)!您引入了与接受的答案相同的错误。303是另一种重定向,并且适用不同的规则,如朱利安·雷施克(Julian Reschke)对已接受答案的评论以及由arcuri82链接的博客所证实的那样
GolezTrol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.