当前位置: 首页 > 知识库问答 >
问题:

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

汪翰墨
2023-03-14

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

>

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

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

    他们似乎很相似。

  • 共有1个答案

    钱均
    2023-03-14

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

    请参阅下面的更多详细信息:

    6.4.2. 301 永久移动

    301(永久移动)状态代码指示已为目标资源分配了新的永久 URI,并且对此资源的任何将来引用都应使用包含的 URI 之一。[...]

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

    6.4.3.找到302个

    < code>302(已找到)状态代码表示目标资源暂时位于不同的URI下。由于重定向有时可能会被更改,所以客户端应该继续为将来的请求使用有效的请求URI。[...]

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

    6.4.7.307临时重定向

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

    注意:此状态代码类似于302(Found),只是它不允许将请求方法从POST。本规范没有为301(永久移动)(RFC 7238为此目的定义了状态代码308

    用户代理可能将请求从 POST 更改为 GET 的“历史原因”在 2011 年 8 月 19 日的 IEInternals 博客的 Eric Lawrence 帖子中进行了解释。

    文章引用了1996年5月发布的过时的RFC 1945中状态码的定义,RFC 1945301定义了HTTP/1.0。该引用的关键部分是:

    注意:当收到301状态码后自动重定向POST请求时,一些现有的用户代理会错误地将其更改为GET请求。

    然后作者继续说:

    […]这句话中提到的“用户代理”包括当时流行的浏览器,包括Netscape Navigator和Internet Explorer。可以说,这种行为正是大多数网站想要的——在成功完成POST后,将用户发送到不同的URL以向他们显示其他内容。然而,POST-转换为-GET行为并不是HTTP作者想要的。

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

    308状态代码现在由RFC 7538定义(已过时的RFC 7238)。

    3.308永久重定向

    308(永久重定向)状态代码表示目标资源已被分配了一个新的永久URI,并且对该资源的任何未来引用都应该使用其中一个随附的URI。具有链接编辑功能的客户端应该在可能的情况下自动将对有效请求URI的引用重新链接到服务器发送的一个或多个新引用。[…]

    注意:此状态代码类似于301(永久移动),只是它不允许将请求方法从POST更改为GET

    因此,我们有以下内容:

                                                                 +-----------+-----------+
                                                                 | 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 Kropat整理了一组决策图,帮助确定每种情况下的最佳状态代码。有关< code>2xx和< code>3xx状态代码,请参见以下内容:

     类似资料:
    • 问题内容: 根据OCP的书,必须避免有状态操作,否则称为有状态lambda表达式。本书中提供的定义是“有状态的lambda表达式,其结果取决于在管道执行期间可能更改的任何状态”。 它们提供了一个示例,其中使用并行流使用函数将固定的数字集合添加到同步的ArrayList 。 arraylist中的顺序是完全随机的,这应该使人看到有状态的lambda表达式在运行时会产生不可预测的结果。因此,强烈建议在

    • 本文向大家介绍http中的301、302、307、308有什么区别?相关面试题,主要包含被问及http中的301、302、307、308有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 301:永久移动 302:发现 307:临时重定向 308:永久重定向 链接

    • 问题内容: 我的问题是关于关键字的一种特殊用法。可以使用关键字覆盖不属于任何函数的类中的代码块。例如,以下代码编译: 如果删除关键字,它将抱怨,因为变量是。但是,可以同时删除和关键字并进行编译。 这两种方式都使我感到困惑。我应该如何拥有不属于任何方法的代码段?如何调用它?通常,此用法的目的是什么?或者更好的是,在哪里可以找到有关此文档的文档? 问题答案: 带有修饰符的代码块表示一个类初始化程序。没

    • 问题内容: 如果是代理设计模式,那么JDK的动态代理和第三方动态代码生成API(例如CGLib)有什么区别? 使用这两种方法之间的区别是什么?何时应该优先选择另一种方法? 问题答案: JDK动态代理只能按接口进行代理(因此,您的目标类需要实现一个接口,然后该接口也可以由代理类实现)。 CGLIB(和javassist)可以通过子类化创建代理。在这种情况下,代理将成为目标类的子类。无需接口。 因此,

    • 在代理设计模式的情况下,jdk的动态代理和第三方的动态代码生成API(如cglib)有什么区别? 使用这两种方法之间有什么区别?什么时候应该选择一种方法而不是另一种方法?

    • 我为Visual Studio代码分析定义了一组规则,并在Sonar(http://www.sonarqube.org/)中配置了这些规则。我得到不同的结果。