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


381

客户应该表现出不同的行为吗?怎么样?


RFC 2616-HTTP状态代码我可以在其中重复所有操作,但是它说得很清楚;)
Tiemen

2
值得注意的是,该规范还提供303和307状态代码,用于更细微的临时重定向。
Patrick McElhaney

303和307不再需要了。303应该指定新的URL是相关的但不等效,并且即使当前请求是POST,也应该使用GET加载,但是浏览器无论如何也要使用302。307应该显式地指定重定向是临时的,而302没有指定重定向是否是临时的,但是浏览器和搜寻器无论如何都将302视为临时。
thomasrutter

Answers:


569

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

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


12
谢谢。这是否意味着如果我使用301(永久)重定向,客户端可以决定不再再次检索旧位置,而是始终直接使用新URL?
flybywire

18
究竟!实际上,根据规范,客户端应始终转到新位置。
菲利普·莱伯特

7
但是在浏览器中,这会如何影响?例如,在“后退”按钮中重写历史记录,以避免在301中返回错误的历史记录?如果您单击一个旧书签,会无声地更改301上的书签?
哈维·蒙特罗2014年

9
@XaviMontero大多数现代浏览器都缓存301,并且在长达6个月的时间里都不会要求任何原始资源
Jon

34
诱骗记住HTTP状态代码301->烫发和302->温度重定向两个始于T,相同的临时开始于T.
ScottCate

108

当搜索引擎蜘蛛在网页的响应标头中找到301状态代码时,它了解到该网页已不存在,它搜索位置标头以作为响应以选择新的URL并用新的URL替换索引的URL并传输pagerank 。

因此,搜索引擎会使用新的URL刷新不再存在(找到301)的所有索引URL,这将保留您的旧网页访问量,对其进行网页排名并将其转移到新的URL(您不会失去旧网页的访问量)。

浏览器:如果浏览器找到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


35

301与302通常对于搜索引擎中的索引很重要,因为它们的抓取工具会考虑到这一点,并在使用301时传输PageRank。

有关更多详细信息,请参见Peter Lee的答案


20

301是已为请求的资源分配了新的永久URI,并且对该资源的任何将来引用都应使用返回的URI之一进行。

302是请求的资源临时驻留在其他URI下。

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

仅当由Cache-Control或Expires标头字段指示时,此响应才是可缓存的。


1
所以301是有意义的,但是我很难为302提供一个很好的示例用法。
鲍勃·斯坦

4
例如,@ BobStein-VisiBone 302重定向:使用代码创建文件old.php <?php header("location: http://example.com/new.php"); ?>和文件new.php- <?php echo 'I am new'; ?>并转到链接。将会重定向并显示文本“我是新人”。然后将old.php中的代码替换为,然后<?php echo 'I am old'; ?>转到链接。您会看到文本“我老了”。如果您在old.php中执行了301重定向,那么即使在old.php代码更改后,您也会看到文本“我是新用户”。
使徒

2
@ BobStein-VisiBone我有一个页面已被弃用,无法显示。我们需要制作一个新页面,但暂时无法准备。我们使用临时重定向到对访问者有用的现有页面。创建新页面后,我们将使用永久重定向到该页面。
EddieC 2015年

4
如果您的目标网址取决于状态,则302很有用。
布莱恩(Brian)

7
我现在已经有一段时间了,但这是一个很好的例子。网络漫画通常都有一个指向最新漫画的URL。如果是这样,webcomic.com/latestwebcomic.com/some-comic-title使用301 重定向到,浏览器将始终重定向到“ some-comic-title”。即使下一个漫画已经出版,现在“最新”也重定向到“另一个漫画标题”……这是302更好的地方。
hsan

17

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

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

当您再次访问该页面时,您的Browser *甚至不费心去请求该URL,它只是转到了缓存的重定向目标。

在Cache中使用该重定向撤消访问者301的唯一方法是将其重定向回原始URL **。在这种情况下,浏览器将注意到循环,并最终真正请求输入的URL。

显然,如果您决定301访问Facebook或您没有完全控制的任何其他资源,那么这不是一个选择。

不幸的是,许多托管服务提供商在其管理界面中提供了一个称为“重定向”的功能,该功能执行301重定向。如果您使用它来将域名临时重定向到Facebook,作为即将发布的页面,那么您基本上就搞砸了。

*根据浏览器缓存HTTP 301的时间,至少是Chrome和Firefox 。刚刚在Chrome 45上试用过。编辑:Mac上的Safari 7.0.6也会缓存,浏览器重启无济于事(Link说在Windows的Safari 5上确实有帮助。)

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

底线:仅在绝对确定不再使用该URL时,才使用301。通常永远不在根目录下(example.com/)


7

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

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


绝对不是“问题”;这就是它的预期工作方式。HTTP重定向到HTTPS,重定向被遗弃的网站到一个新的,等等,都是一些301的通常用法
HosseyNJF
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.