首页 > 解决方案 > 是否还有 HTTP 301 而不是 HTTP 308 的用例来指示资源已移动(尤其是在 ReST 服务器中)?

问题描述

我正在指定一个 ReST 服务。我最近偶然发现了这个IETF 草案文件,它可能被解释为建议 ReST 服务应该总是返回 308。请注意,该文件似乎已经过期而没有被取代(我对 IETF 流程不是很清楚)。

我之前的想法是,服务应该为 GET 返回“301 Moved Permanently”,为 POST 返回“ 308 Permanent Redirect ”,以确保它不会被不恰当地转换为 GET(通过一些试图变得聪明的东西)。

301 和 308 的使用似乎都是用应该和不应该而不是必须和必须不来表达的,所以在哲学上还不清楚什么是“正确的事情”。

GET 的 301 和 POST 的 308 应该有效。GET 的 308 没有错误,因为在撰写本文时的当前版本包括响应 GET 生成 308 的示例。现在有一个部署问题,如果客户不理解 308,它应该将其视为 300(而不是 301,这对我来说更有意义)但是 308 现在已被广泛理解,所以问题变成了你是否应该或为什么应该使用 HTTP 301?

如果 308 本质上是对 301 的错误修复,为什么 301 没有在 HTTP/1.1 中正式弃用?是否有合法的用例将 POST 转换为 GET 以在 ReST 中或更一般地在 HTTP 中进行重定向?

对于 301 HTTP/1.1 说:

注意:由于历史原因,用户代理可以将后续请求的请求方法从 POST 更改为 GET。

为什么这是一个好主意?它在任何地方仍然有效吗?

也可以看看:

标签: resthttphttp-status-codes

解决方案


如果308本质上是一个 bug 修复301,为什么301在 HTTP/1.1 中没有正式弃用?

不,这不对。

定义状态代码的RFC 7538308不会无效或301过时。它只是定义了另一个状态代码来填补RFC 7231的空白,它没有定义状态代码的永久变体307

+-------------------------------------------+-----------+-----------+
|                                           | Permanent | Temporary |
+-------------------------------------------+-----------+-----------+
| Allows changing the request method from   | 301       | 302       |
| POST to GET                               |           |           |
| Does not allow changing the request       | -         | 307       |
| method from POST to GET                   |           |           |
+-------------------------------------------+-----------+-----------+

实际上,我仍然看到301主要用于 SEO。而且我看到一些 HTTP 客户端无法识别308.


除了 RFC,让我们看看 Mozilla 的 MDN Web Docs 是怎么301

超文本传输​​协议 (HTTP)301 Moved Permanently重定向状态响应代码指示请求的资源已明确移动到 Location 标头给出的 URL。浏览器重定向到这个页面并且搜索引擎更新他们到资源的链接(在'SEO-speak'中,据说'link-juice'被发送到新的URL)。

即使规范要求在执行重定向时不要更改方法(和主体),但并非所有用户代理都与它保持一致 - 您仍然可以在那里找到这种类型的错误软件。因此,建议301仅将代码用作GETorHEAD方法的响应,而改用308 Permanent RedirectforPOST方法,因为在此状态下明确禁止更改方法。

现在看看 Mozilla 是怎么308

超文本传输​​协议 (HTTP)308 Permanent Redirect重定向状态响应代码指示请求的资源已明确移动到Location标头给出的 URL。浏览器重定向到这个页面并且搜索引擎更新他们到资源的链接(在'SEO-speak'中,据说'link-juice'被发送到新的URL)。

请求方法和正文不会被更改,而301有时可能会错误地更改为GET方法。

注意:某些 Web 应用程序可能会以308 Permanent Redirect非标准方式和其他目的使用 。例如,308 Resume Incomplete当不完整的上传停止时,Google Drive 使用响应向客户端指示。(参考)


推荐阅读