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

Ale*_*sky 94 http http-status-codes http-status-code-301 http-status-code-308

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

  • 301 (永久移动):此和所有将来的请求应定向到给定的URI.

  • 308 (永久重定向):应使用另一个URI重复请求和所有将来的请求.

他们似乎很相似.

cas*_*lin 200

概述301,302307

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

查看以下详细信息:

6.4.2.301永久移动

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

注意:由于历史的原因,用户代理可以从改变请求方法POSTGET用于随后的请求.如果不希望出现此行为,307则可以使用(临时重定向)状态代码.

6.4.3.302找到

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

注意:由于历史的原因,用户代理可以从改变请求方法POSTGET用于随后的请求.如果不希望出现此行为,307则可以使用(临时重定向)状态代码.

6.4.7.307临时重定向

307(临时重定向)状态代码表示该目标资源暂时位于如果它执行一个自动重定向到该URI不同的URI和用户代理必须不改变请求方法.由于重定向可能会随着时间的推移而发生变化,因此客户端应继续使用原始有效请求URI以用于将来的请求.[...]

注意:此状态代码与302(Found)类似,不同之处在于它不允许将请求方法更改POSTGET.此规范未定义301(Moved Permanently)(RFC 7238,但308 为此目的定义状态代码(永久重定向)).

需要 308

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

现在,308状态代码由RFC 7538(已废弃RFC 7238)定义.

3. 308永久重定向

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

注意:此状态代码类似于301(Moved Permanently),但不允许将请求方法更改 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       |
+------------------------------------------------------------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

选择最合适的状态代码

看看下面的图表(从这个页面中提取):

选择2xx或3xx状态代码

  • 鉴于问题具体是关于 301 和 308 之间的目的地,您能否给出更多解释:_“不允许将请求方法从`POST`更改为`GET`”_?这是否意味着无法处理已发布的表单,但可以提供新的新表单,然后在下一个请求中发布? (7认同)
  • 这篇文章 [the-definitive-guide-to-get-vs-post](https://blog.teamtreehouse.com/the-definitive-guide-to-get-vs-post) 阐明了为什么允许“POST” `(安全)请求被*更改*为`GET`(不安全,因为数据通过添加到 URL 来传递 - 并且 URL 可以被保存 - 包括密码)请求可能是一个安全问题,通常应该是避免,除非您“知道”更改是安全的。如今,似乎普遍支持并首选使用 307、308,而不是 301、302。但您应该验证一下。 (4认同)
  • 助记符“308”就像一个横向无穷大,因此永久重定向,并且永远不会改变请求方法 - 它也是永久的、固定的请求类型。然后,`307` 是下面的 `1` 步骤 - 永久/保留请求方法(Get/Post),但重定向到临时位置:7 - 看起来像“左转”或临时绕道,7 也类似于 k ,所以“保留”请求方法。 (3认同)
  • 该规范草案 (https://tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html) 建议 ReSTful 服务即使对于 GET 也应使用 308。“除非服务提供商知道客户端实际上是用户代理,否则不应使用 HTTP 重定向代码 301-306。” 然而,这只是一个草案。我不确定它是否/何时会被接受。 (2认同)