ChatGPT解决这个技术问题 Extra ChatGPT

HTTP 重定向:301(永久)与 302(临时)

客户应该表现不同吗?如何?

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

P
Philippe Leybaert

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

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


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

当搜索引擎蜘蛛在网页的响应头中找到 301 状态码时,它知道该网页不再存在,它会搜索位置头作为响应,选择新的 URL 并将索引的 URL 替换为新的 URL,并传输 pagerank .

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

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

https://i.stack.imgur.com/L6rTg.png

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

https://i.stack.imgur.com/0p9K8.png

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


C
Cody Gray

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

有关详细信息,请参阅 Peter Lee's answer


n
nyedidikeke

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 更好的地方。
C
Community

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

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

当您再次访问该页面时,您的 Browser* 甚至都不会请求该 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/)上


P
Pang

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

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


这绝对不是“问题”;这就是它的预期工作方式。将 HTTP 重定向到 HTTPS、将废弃的网站重定向到新网站等,是 301 的一些常用用法。