是否仍然存在HTTP 301而非HTTP 308的用例来指示资源已移动(特别是在ReST服务器中)?
我正在指定ReST服务。我最近偶然发现了这一点,这可能被解释为建议ReST服务应该始终返回308。请注意,该文档似乎已过期而未被取代(我不太清楚IETF流程) 早些时候我曾想过,服务应该为GET返回“301永久移动”,为POST返回“301永久移动”,以确保它不会不适当地转换为GET(通过一些尝试变得聪明的方式) 301和308的用法似乎都是用应该和不应该来表达的,而不是用必须和不应该来表达的,所以从哲学上来说,什么是“正确的事情”还不清楚 从实用角度看,301表示GET,308表示POST应该有效。 308 for GET没有错,因为在编写本文时包含了响应GET生成308的示例。 现在有一个部署问题,如果客户机不理解308,它应该将其视为300(而不是对我来说更有意义的301),但308现在已被广泛理解,因此问题变成了是否应该或为什么应该使用HTTP 301 如果308本质上是301的一个bug修复程序,那么为什么在HTTP/1.1中301没有被正式弃用呢?在ReST或更一般的HTTP中将POST转换为GET重定向是否有合法的用例 对于301,HTTP/1.1说: 注意:由于历史原因,用户代理可能会更改请求 方法从POST获取后续请求 为什么这是个好主意?它在任何地方仍然有效吗 另见:是否仍然存在HTTP 301而非HTTP 308的用例来指示资源已移动(特别是在ReST服务器中)?,rest,http,http-status-codes,Rest,Http,Http Status Codes,我正在指定ReST服务。我最近偶然发现了这一点,这可能被解释为建议ReST服务应该始终返回308。请注意,该文档似乎已过期而未被取代(我不太清楚IETF流程) 早些时候我曾想过,服务应该为GET返回“301永久移动”,为POST返回“301永久移动”,以确保它不会不适当地转换为GET(通过一些尝试变得聪明的方式) 301和308的用法似乎都是用应该和不应该来表达的,而不是用必须和不应该来表达的,所以从哲学上来说,什么是“正确的事情”还不清楚 从实用角度看,301表示GET,308表示POST应该
- 它很好地涵盖了301和308之间的差异,但没有涵盖这一点李>
308
本质上是301
的一个bug修复,那么为什么HTTP/1.1中没有正式弃用301
不,不是
定义308
状态代码的不会使301
无效或过时。它只是定义了另一个状态代码来填补上的空白,而不是定义永久性的
状态代码的变体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
在搜索引擎优化中被大量使用。我看到一些HTTP客户端无法识别308
除了RFC之外,让我们看看Mozilla的MDN Web文档中关于
301
的内容:
超文本传输协议(HTTP)301永久移动
重定向状态响应代码表示请求的资源已最终移动到位置标头给定的URL。浏览器重定向到此页面,搜索引擎更新其到资源的链接(在“SEO演讲”中,据说“链接果汁”被发送到新的URL)
即使规范要求在执行重定向时不更改方法(和主体),也不是所有用户代理都与之对齐-您仍然可以在那里找到此类有缺陷的软件。因此,建议仅将301
代码用作GET
或HEAD
方法的响应,并将308永久重定向
用于POST
方法,因为此状态明确禁止方法更改
现在看看Mozilla对308的看法:
超文本传输协议(HTTP)308永久重定向
重定向状态响应代码表示请求的资源已被最终移动到位置
标题给出的URL。浏览器重定向到此页面,搜索引擎更新其到资源的链接(在“SEO演讲”中,据说“链接果汁”被发送到新的URL)
请求方法和正文不会更改,而301
有时可能会错误地更改为GET
方法
注意:某些Web应用程序可能以非标准方式使用308永久重定向
,或用于其他目的。例如,Google Drive使用一个308 Resume completed
响应向客户端指示不完整上传何时暂停
通常这是你的(设计)决定。在你的例子中,不会有很大的区别。但是如果您将其标准化,就不需要担心不同的情况。问问自己,使用新的308比旧的301有什么缺点吗?如果不使用较新的协议,我希望通过HTTP这样定义良好的协议,我们可以朝着有一种正确方法的设计方向发展。在这种情况下,我认为它是308(我在问‘互联网’为什么我错了——或者可能是对的),但如果308是301的错误修复,为什么IETF不反对301呢。301是否仍然有一个与308分开的合理用例?308不是一个bug修复程序。它是一个扩展,用于确保使用相同的方法(例如POST->POST)。程序或浏览器对它的反应取决于实现。301不会反对这么快。308将在协议中添加另一层保护/安全性。客户机应如何解释状态代码主要包含在标准中,因此它不依赖于实现。如果我为一个不存在的资源返回400而不是404,那么我就错了。有些系统,包括“ReSTish”API,没有正确遵循标准。可能存在一些歧义(301/308可能是其中之一)。301不会在一夜之间从实现中消失。问题是308是否让它变得多余?(如果是这样的话,正确的做法是始终使用308,并将301标记为已弃用)。为什么这是一个好主意?它在任何地方仍然有效吗?如果我们足够幸运的话,我们可能会从作者和与Fielding合作的作者那里得到一些信息。如果不解释为什么“允许将请求方法从POST更改为get”是一个好主意,我不能接受这个答案,因为这是问题的关键