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

301(永久移动):这和所有未来的请求都应该指向给定的URI。 308(永久重定向):请求和所有未来的请求应该使用另一个URI重复。

它们看起来很相似。


301、302和307的概述

RFC 7231是当前HTTP/1.1协议的语义和内容引用,定义了301(永久移动)和302(已找到)状态码,允许将请求方法从POST更改为GET。该规范还定义了307(临时重定向)状态代码,不允许将请求方法从POST更改为GET。

详情如下:

6.4.2. 301永久搬迁 301(永久移动)状态码表示目标 资源已被分配一个新的永久URI和任何未来 对该资源的引用应该使用其中一个包含的uri。[…] 注意:由于历史原因,用户代理可能会更改请求 方法从POST到GET为后续请求。如果这 行为是不希望的,307(临时重定向)状态码 可以代替。

6.4.3. 302年发现的 302 (Found)状态代码表示目标资源 暂时驻留在不同的URI下。由于重定向 可能在某些情况下被修改,客户应该继续使用 未来请求的有效请求URI。[…] 注意:由于历史原因,用户代理可能会更改请求 方法从POST到GET为后续请求。如果这 行为是不希望的,307(临时重定向)状态码 可以代替。

6.4.7. 307 Temporary Redirect The 307 (Temporary Redirect) status code indicates that the target resource resides temporarily under a different URI and the user agent MUST NOT change the request method if it performs an automatic redirection to that URI. Since the redirection can change over time, the client ought to continue using the original effective request URI for future requests. [...] Note: This status code is similar to 302 (Found), except that it does not allow changing the request method from POST to GET. This specification defines no equivalent counterpart for 301 (Moved Permanently) (RFC 7238, however, defines the status code 308 (Permanent Redirect) for this purpose).

将请求方法从POST更改为GET

Eric Lawrence在2011年8月19日IEInternals博客上的一篇文章中解释了用户代理可能将请求从POST更改为GET的“历史原因”。

该帖子引用了1996年5月发布的过时RFC 1945中对状态码301的定义,该文件定义了HTTP/1.0。这句话的关键部分是:

注意:当收到301状态码后自动重定向POST请求时,一些现有的用户代理会错误地将其更改为GET请求。

接着作者继续说道:

[…此处所指的“用户代理”包括当时流行的浏览器,包括Netscape Navigator和Internet Explorer。可以说,这种行为正是大多数网站想要的——在一个成功的POST之后,将用户发送到一个不同的URL,以向他们展示其他内容。但是,post - conversion -to- get行为并不是HTTP作者所希望的。

308的需求

RFC 7238定义了308(永久重定向)状态码,它类似于301(永久移动),但不允许将请求方法从POST更改为GET。

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

3. 308 Permanent Redirect The 308 (Permanent Redirect) status code indicates that the target resource has been assigned a new permanent URI and any future references to this resource ought to use one of the enclosed URIs. Clients with link editing capabilities ought to automatically re-link references to the effective request URI to one or more of the new references sent by the server, where possible. [...] Note: This status code is similar to 301 (Moved Permanently), except that it does not allow changing the request method from POST to GET.

我们有以下几点:

                                                             +-----------+-----------+
                                                             | 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整理了一组决策图表,帮助确定每种情况下的最佳状态代码。2xx和3xx状态代码如下: