Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否仍然存在HTTP 301而非HTTP 308的用例来指示资源已移动(特别是在ReST服务器中)?_Rest_Http_Http Status Codes - Fatal编程技术网

是否仍然存在HTTP 301而非HTTP 308的用例来指示资源已移动(特别是在ReST服务器中)?

是否仍然存在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应该

我正在指定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获取后续请求

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

另见:

  • 它很好地涵盖了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”是一个好主意,我不能接受这个答案,因为这是问题的关键