【问题标题】:HTTP redirect: 301 (permanent) vs. 302 (temporary)HTTP 重定向:301(永久)与 302(临时)
【发布时间】:2010-11-26 11:15:36
【问题描述】:

客户应该表现得不同吗?怎么样?

【问题讨论】:

  • RFC 2616 - HTTP Status Codes 我可以重复那里的所有内容,但它说得很清楚;)
  • 值得注意的是,该规范还为更细微的临时重定向提供了 303 和 307 状态代码。
  • 303 和 307 不再需要了。 303 应该指定新 URL 是相关的但不等效,并且即使当前请求是 POST,也应该使用 GET 加载,但浏览器也可以使用 302 执行此操作。 307 应该明确指定重定向是临时的,而 302 没有指定它是否是临时的,但是浏览器和爬虫仍然将 302 视为临时的。

标签: http redirect http-status-code-301 http-status-code-302


【解决方案1】:

301 是已为请求的资源分配了一个新的永久 URI,以后对该资源的任何引用都应使用返回的 URI 之一完成。

302 是请求的资源暂时驻留在不同的 URI 下。

由于有时可能会更改重定向,因此客户端应继续使用 Request-URI 来处理未来的请求。

此响应仅在 Cache-Control 或 Expires 标头字段指示时才可缓存。

【讨论】:

  • 所以 301 是有道理的,但我很难为 302 找到一个很好的示例。
  • @BobStein-VisiBone 以 302 重定向为例:使用代码 <?php header("location: http://example.com/new.php"); ?> 创建文件 old.php 和文件 new.php - <?php echo 'I am new'; ?> 并转到 link。将重定向并显示文本“我是新人”。然后将 old.php 中的代码替换为<?php echo 'I am old'; ?> 并转到link。你会看到文字“我老了”。如果您在 old.php 中执行了 301 重定向,即使更改 old.php 的代码,您也会看到文本“我是新人”。
  • @BobStein-VisiBone 我有一个已弃用且无法显示的页面。我们需要创建一个新页面,但暂时还没有准备好。我们使用临时重定向到对访问者有用的现有页面。创建新页面后,我们将使用永久重定向到它。
  • 如果您的目标 URL 取决于州,302 很有用。
  • 我现在已经有一段时间了,但这是一个很好的例子。网络漫画通常有一个指向最新漫画的 url。如果那是webcomic.com/latest 并使用 301 重定向到 webcomic.com/some-comic-title,则浏览器将始终重定向到“some-comic-title”。即使下一部漫画已经出版并且“最新”现在重定向到“another-comic-title”......这也是 302 更好的地方。
【解决方案2】:

状态 301 表示资源(页面)被永久移动到新位置。客户端/浏览器不应尝试请求原始位置,而是从现在开始使用新位置。

状态 302 表示资源暂时位于其他地方,客户端/浏览器应继续请求原始 url。

【讨论】:

  • 谢谢。这是否意味着如果我使用 301(永久)重定向,客户端可以决定不再检索旧位置,而是始终直接使用新 URL?
  • 没错!事实上,根据规范,客户端应该总是去新的位置。
  • 但是在浏览器中,这有什么影响呢?例如,重写后退按钮中的历史记录,以避免回到 301 中的错误?如果您单击旧书签,是否会在 301 上静默更改书签?
  • @XaviMontero 大多数现代浏览器都会缓存 301,并且在长达 6 个月的时间内根本不会请求原始源代码
  • 技巧记住 HTTP 状态码 301->Perm 和 302->Temp Redirect 两个以 T 开头,与 Temporary 以 T 开头一样。
【解决方案3】:

301 vs 302 对搜索引擎的索引很重要,因为它们的爬虫会考虑到这一点,并在使用 301 时转移 PageRank。

更多详情请见Peter Lee's answer

【讨论】:

    【解决方案4】:

    当搜索引擎蜘蛛在网页的响应标头中发现 301 状态代码时,它知道该网页不再存在,它会搜索位置标头以响应选择新的 URL 并将索引的 URL 替换为新的 URL,然后也转移pagerank。

    所以搜索引擎会用新的 URL 刷新所有不再存在的索引 URL(找到 301),这将保留您的旧网页流量,pagerank 并将其转移到新的(您不会失去旧网页的流量) .

    浏览器:如果浏览器发现 301 状态码然后缓存旧 URL 与新 URL 的映射,客户端/浏览器将不再尝试请求原始位置,而是从现在开始使用新位置,除非缓存是清除。

    当搜索引擎蜘蛛发现网页的 302 状态时,它只会临时重定向到新位置并抓取两个页面。旧的网页 URL 仍然存在于搜索引擎数据库中,它总是试图请求旧的位置并对其进行爬取。客户端/浏览器仍会尝试请求原始位置。

    阅读更多关于如何在 asp.net c# 中实现它以及对搜索引擎有什么影响 - http://www.dotnetbull.com/2013/08/301-permanent-vs-302-temporary-status-code-aspnet-csharp-Implementation.html

    【讨论】:

      【解决方案5】:

      301 重定向被无限期缓存(至少在某些浏览器中)。

      这意味着,如果您设置了 301,访问该页面,您不仅会被重定向,还会缓存该重定向。

      当您再次访问该页面时,您的浏览器* 甚至不会请求该 URL,它只是转到缓存的重定向目标。

      在缓存中为具有该重定向的访问者撤消 301 的唯一方法是重新重定向回原始 URL**。那样的话,浏览器会注意到这个循环,最后才真正请求输入的 URL。

      显然,如果您决定 301 到 facebook 或您无法完全控制的任何其他资源,那么这不是一个选择。

      不幸的是,许多托管服务提供商在其管理界面中提供了一项简称为“重定向”的功能,它会执行 301 重定向。如果您使用它来临时将您的域重定向到 facebook 作为即将推出的页面,那么您基本上就完蛋了。

      *至少 Chrome 和 Firefox,根据How long do browsers cache HTTP 301s?。刚刚用 Chrome 45 试了一下。 编辑:Mac 上的 Safari 7.0.6 也缓存,重新启动浏览器没有帮助(链接说在 Windows 上的 Safari 5 上它确实有帮助。)

      **我尝试了 javascript window.location = '',因为它是在大多数情况下都可以应用的解决方案 - 它不起作用。它会导致未检测到的无限循环。但是,php header('Location: new.url') 确实打破了循环

      底线:如果您绝对确定您永远不会再使用该 URL,则仅使用 301。通常从不在根目录 (example.com/)

      【讨论】:

        【解决方案6】:

        301 的主要问题是即使您从服务器级别禁用重定向,浏览器也会缓存重定向。

        如果您为较短的维护窗口启用重定向,最好使用 302。

        【讨论】:

        • 绝对不是“问题”;这就是它的预期工作方式。将 HTTP 重定向到 HTTPS、将废弃的网站重定向到新网站等,是 301 的一些常用用法。
        猜你喜欢
        • 2016-09-08
        • 2012-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        • 2013-07-17
        • 1970-01-01
        • 2012-05-31
        相关资源
        最近更新 更多