【问题标题】:What's the difference between HTTP 301 and 308 status codes?HTTP 301 和 308 状态码有什么区别?
【发布时间】:2017-06-27 11:17:16
【问题描述】:

HTTP 301308 状态码有什么区别?

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

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

它们看起来很相似。

【问题讨论】:

  • tools.ietf.org/html/rfc2616tools.ietf.org/html/rfc6585 中没有代码 308,所以这个问题必须向这个非标准代码的发明者提出。
  • 有 RFC 7538 规范,因此是真正的 HTTP 代码
  • 好吧,tools.ietf.org/html/rfc7538:注意:这个状态码和 301 类似,只是它不允许将请求方法从 POST 更改为 GET。
  • 不要使用 RFC 2616 作为参考。它已被 RFC 7230-35 淘汰。

标签: http http-status-code-301 http-status-codes http-status-code-308


【解决方案1】:

301302307 的概述

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

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

6.4.2. 301 Moved Permanently

301(永久移动)状态码表示目标 资源已被分配一个新的永久 URI 和任何未来 对该资源的引用应该使用封闭的 URI 之一。 [...]

注意:由于历史原因,用户代理可能会更改请求 从POSTGET 的方法用于后续请求。如果这 行为不受欢迎,307(临时重定向)状态码 可以改用。

6.4.3. 302 Found

302 (Found) 状态码表示目标资源 临时驻留在不同的 URI 下。由于重定向 有时可能会更改,客户应继续使用 未来请求的有效请求 URI。 [...]

注意:由于历史原因,用户代理可能会更改请求 从POSTGET 的方法用于后续请求。如果这 行为不受欢迎,307(临时重定向)状态码 可以改用。

6.4.7. 307 Temporary Redirect

307(临时重定向)状态码表示目标 资源临时驻留在不同的 URI 和用户代理下 如果请求方法执行自动 重定向到该 URI。由于重定向会随着时间而改变, 客户端应该继续使用原来的有效请求 URI 用于将来的请求。 [...]

注意:此状态码类似于302(已找到),不同之处在于它 不允许将请求方法从POST 更改为GET。这 规范没有定义 301 的等效对应物(移动 永久)(RFC 7238,然而,定义状态码308 (永久重定向)用于此目的)。

需要308

已创建RFC 7238 来定义308(永久重定向)状态码,类似于301(永久移动)但不允许将请求方法从POST 更改为@ 987654371@.

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

3. 308 Permanent Redirect

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 Kropatset of decision charts 放在一起,有助于确定每种情况的最佳状态代码。有关2xx3xx 状态代码,请参阅以下内容:

【讨论】:

  • 鉴于问题具体是关于 301 和 308 之间的目的地,您能否对以下内容进行更多解释:“不允许将请求方法从 POST 更改为 @987654381 @"?这是否意味着无法处理已发布的表单,但可以提供新的表单,然后在下一次请求时发布?
  • 这个草案规范 (tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html) 建议即使是 GET 也应该使用 308。 “除非服务提供商知道客户端实际上是用户代理,否则不应使用 HTTP 重定向代码 301-306。”然而,这只是一个草案。我不确定它是否/何时会被接受。
  • 这篇 the-definitive-guide-to-get-vs-post 的帖子阐明了为什么允许将 POST(安全)请求更改GET(不安全,因为数据被传递将其添加到 url - 并且可以保存 url - 包括密码)请求可能是一个安全问题,通常应该避免,除非您知道更改它是安全的。这些天来,似乎普遍支持并首选使用 307、308 而不是 301、302。但您应该验证。
  • 助记符308就像一个横向的无穷大,所以永久重定向,也永远不会改变请求方法——它也是一个永久的、固定的请求类型。然后,3071 下面的步骤 - 永久/保留请求方法(获取/发布),但重定向到临时位置:7 - 看起来像“左转”或临时绕道,并且 7 看起来也类似于 k ,所以“保留”请求方法。
  • 你忘了说Resume Incomplete
猜你喜欢
  • 2014-10-20
  • 2012-12-18
  • 2010-12-12
  • 2018-02-16
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2018-02-06
相关资源
最近更新 更多