HTTP 301和308状态代码有什么区别?


137

HTTP 301308状态代码之间有什么区别?

  • 301 (永久移动):此请求和所有以后的请求都应定向到给定的URI。

  • 308 (永久重定向):应使用另一个URI重复该请求和以后的所有请求。

他们似乎很相似。


tools.ietf.org/html/rfc2616tools.ietf.org/html/rfc6585中没有代码308 ,因此必须将此非标准代码的发明人解决这个问题。
KonstantinL

4
有规范RFC 7538,因此它是真实的HTTP代码
Alexander Drobyshevsky

2
好吧,tools.ietf.org/html/rfc7538:注意:此状态码类似于301,不同之处在于它不允许将请求方法从POST更改为GET。
KonstantinL

4
不要将RFC 2616用作参考。RFC 7230-35已废弃它。
cassiomolin '17

Answers:


257

概述301302307

RFC 7231中,语义和HTTP / 1.1协议的内容的当前参考,定义了301(永久移动)和302(实测值)的状态码,其允许从改变请求方法POSTGET。该规范还定义了307(临时重定向)状态码,该状态码不允许将请求方法从更改POSTGET

在下面查看更多详细信息:

6.4.2。301永久移动

301(永久移动)状态代码表示目标资源已经被分配了一个新的永久性URI,该资源的任何将来参考应该使用封闭的URI之一。[...]

注意:由于历史原因,用户代理可以将请求方法从POST更改GET为后续请求。如果不希望出现这种情况,则307可以改用(Temporary Redirect)状态代码。

6.4.3。找到302个

302(实测值)状态代码表示目标资源下不同的URI临时驻留。由于重定向有时可能会更改,因此客户端应继续将有效请求URI用于将来的请求。[...]

注意:由于历史原因,用户代理可以将请求方法从POST更改GET为后续请求。如果不希望出现这种情况,则307可以改用(Temporary Redirect)状态代码。

6.4.7。307临时重定向

307(临时重定向)状态代码表示它是否执行自动重定向到该URI暂时下一个不同的URI和用户代理目标资源驻留不能改变的请求方法。由于重定向会随时间变化,因此客户端应继续将原始的有效请求URI用于将来的请求。[...]

注意:此状态代码类似于302(已找到),但是它不允许将请求方法从更改POSTGET。该规范没有为301(永久移动)定义等效项(RFC 7238308 为此目的定义了状态代码(永久重定向))。

需要 308

RFC 7238已创建来定义308(永久重定向)状态代码,是类似于301(永久移动),但不允许从被改变的请求方法POSTGET

308状态代码现在由定义RFC 7538(即废弃的RFC 7238)。

3. 308永久重定向

308(永久重定向)状态代码表示目标资源已经被分配了一个新的永久性URI,该资源的任何将来参考应该使用封闭的URI之一。具有链接编辑功能的客户端应在可能的情况下自动将对有效请求URI的引用重新链接到服务器发送的一个或多个新引用。[...]

注意:此状态代码类似于301(永久移动),但是它不允许将请求方法从更改 POSTGET

硒,我们有以下内容:

                                                             +-----------+-----------+
                                                             | Permanent | Temporary |
+------------------------------------------------------------+-----------+-----------+
| Allows changing the request method from POST to GET        | 301       | 302       |
+------------------------------------------------------------+-----------+-----------+
| Doesn't allow changing the request method from POST to GET | 308       | 307       |
+------------------------------------------------------------+-----------+-----------+

选择最合适的状态码

迈克尔·克罗帕特(Michael Kropat)整理了一组决策图,有助于确定每种情况的最佳状态代码。请参阅以下2xx3xx状态代码:

选择2xx或3xx状态代码


3
鉴于问题专门针对301和308之间的目标,您是否可以提供更多解释:“不允许将请求方法从更改POSTGET?这是否意味着无法处理已过帐的表单,但是可以处理新的新表单,然后在下一个请求中将其过帐?
R. Schreurs '18

1
该规范草案(tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html)建议,即使是GET,ReSTful服务也应使用308。“除非服务提供商知道客户端实际上是用户代理,否则不应使用HTTP重定向代码301-306。” 但是,这只是草稿。我不确定是否/何时会接受。
布鲁斯·亚当斯

1
这篇最终权威性的帖子明确了为什么允许将一个POST(安全)请求更改为to GET(不安全的原因是,将数据添加到url来传递数据-可以保存url -包括密码)请求可能是一个安全问题,通常应避免,除非您知道可以安全地进行更改。如今,似乎普遍支持使用307、308,而不是301、302。但是您应该进行验证。
SherylHohman

1
助记符308就像是一个侧向无穷大,因此是永久重定向,也永远不会更改请求方法-它也是永久的,固定的请求类型。然后,3071下面的步骤-永久/保留请求方法(获取/发布),但重定向到临时位置:7-看起来像“向左转”或临时绕道,而7也类似于k,因此“保留”请求方法。
SherylHohman

您忘记提及恢复未完成
克努
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.