HTTP重定向是引导访问者(用户或者爬虫机器人)从一个URL到另一个URL的方。重定向的使用场景一般有以下几项:
- URL变更:当内容迁移到新的地址时,你仍然想访问者可以通过旧的链接自动的重定向到新的地址,而不是返回404页面。
- HTTP转HTTPS:为了保证数据安全性,你需要让使HTTP的访问重定向至更安全的HTTPS。
- 地理位置定位:你想根据用户的地理位置(根据IP地址判断)或浏览器语言设置,将用户重定向至本地的页面。
- 设备区分:你想对于使用智能手机或者平板电脑的用户,重定向至对移动端设备更友好的移动版网站。
- A/B 测试:你想重定向不同的用户至不同的页面,以对比哪个页面的用户体验更好。
- 别名机制:创建一个易于记忆的短网址,并将其重定向到更长的网址。
- 网站维护:当你的网站正在维护时,你希望给用户展示个“维护中”的静态页面告知用户网站维护中。
HTTP重定向是如何工作的?
HTTP是一个请求/响应式的协议。当用户输入一个网站时,客户端会发送请求给服务端,服务端收到请求后,会返回给客户端响应。下面是Firefox浏览器请求网站 drlinkcheck.com
首页的例子:
在这个例子中,服务端返回了200(OK)的状态码,并将请求的页面包括在正文(body)中。
如果服务端想让客户端去访问另一个URL,他会返回3xx的状态码并在首部的Location
字段指定目标URL。
永久重定向:301和308
HTTP状态码中的 301 和 308 被用于当一个资源被永久的迁移到新的地址上的情况。当重建一个网站或者将网站从HTTP迁移至HTTPS时,选择永久重定向是个正确的选择。
301 和 308的不同之处在于,当接收到308的响应时,客户端必须在新地址上重复同样的请求,而301重定向会改变请求的方法,将POST方法改变成GET方法来请求新地址。
这意味着,当客户端携带正文内容向服务端发送POST请求,服务端返回了308的状态码时,客户端必须携带同样的正文内容向新地址发起POST请求。而当服务端返回了301的状态码时,客户端可能如308请求一样,携带正文发起POST请求,但是也可能不这样做(实际上,几乎所有客户端重新发起的都是GET请求)。
308状态码有个问题是它相对较新(2015年4月在RFC 7538中引入),因此并非所有的浏览器和爬虫器都支持,例如在Windows 7 和 Windows 8 的 IE11上是无法理解308的,只会展示一个空页面而不是重定向。
由于对308的支持仍然有限,目前建议仍然使用301重定向,除非你要求客户端必须正确重定向并确定所有的客户端都支持308状态码。
临时重定向:302、303和307
302,303和307状态码被用于当资源需要临时重定向到新URL上的情况,这意味着此重定向只是临时起作用且不应该被缓存。这样的例子如当你的网站在停机维护中时,你会临时的展示一个“维护中”的页面,当基于访问者特定的条件(例如地理位置,时间或设备)进行重定向时,建议将重定向标记为临时。
HTTP/1.0的规范(发布于1996年)中,临时重定向的状态码仅包含302,尽管规范指定不允许客户端更改重定向请求的请求方法,然而大部分浏览器却忽略这个规定,在重定向后的新请求上使用GET请求,这就是HTTP/1.1(发行与1999年)中引进303和307状态码的原因,以使客户端可以明确的知道如何实现。
HTTP状态码 303(“See Other”) 告诉客户端临时被移动至新地址,并且明确告诉客户端在新URL上使用GET请求,不管原请求使用的是什么方法。
状态码307(“Temporary Redirect”)规定了客户端用另一个URL重新发起请求,且使用的方法和原方法一样。例如当使用POST方法发起请求时,重定向后发起的仍然是POST请求。
在实践中,浏览器和爬虫使用同样的处理方式对待302和303,意味着重定向后始终使用GET方法发起请求。
虽然303和307状态码已在1999年的标准中提出,然而仍有一些客户端为执行此标准,就像308状态码一样。除非您需要重复POST请求(在这种情况下,请使用307)或知道目标客户端支持代码303和307,否则请仍然使用302重定向。
SEO的注意事项
当Google的爬虫遇到301和308的永久重定向时,它会舍弃掉旧的页面,替换成新的地址。问题是这如何影响页面排名呢?在这个视频里,马特·库茨解释说,301重定向对页面排名只有一点点的影响。因此,如果您要重组网站而不想对Google的排名产生负面影响,则可以采用永久重定向。
另一方面,Google或多或少忽略了临时重定向(状态代码302、303和307)。搜索引擎知道重定向只是暂时性的,并保持原始页面的索引状态,而无需将任何链接源转移到目标URL。
重定向的影响
使用HTTP重定向时要考虑的另一方面是对性能的影响。每次重定向都需要向服务器发送一个额外的HTTP请求,通常会增加几百毫秒的页面加载时间。从用户体验的角度来看,这很糟糕,并给Web服务器造成不必要的压力。虽然单个重定向不会带来太大的伤害,但是绝对应该避免一个重定向导致另一重定向的重定向链情况的发生。
如果您要确定网站上的所有重定向,我们的链接检查器可以为您提供帮助,只需输入您网站的URL,然后点击“开始检查”按钮即可。一旦检查结束,您将在“Redirects”里看到临时重定向和永久重定向的数量,单击其中一项以获取所有重定向链接的列表。如果将鼠标悬停在链接项上,然后单击“详细信息”按钮,则可以看到整个重定向链。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVvyjuWk-1619614076343)(https://cdn.drlinkcheck.com/blog/link-details-redirects.png)]
结论
五个不同的重定向状态码,难怪许多网站所有者在进行重定向时会感到困惑。我的建议如下:
- 当页面或文件现在在新URL下永久可用并且您希望搜索引擎使用新URL时,请使用301重定向。
- 当页面仅在当前URL下临时可用并且您不希望搜索引擎替换其原始URL时,请使用302重定向。
- 仅当您确实需要303、307和308重定向并且知道您在做什么时,才建议使用303、307和308重定向。
- 另外,将重定向保持在最低限度,因为每个重定向都需要新发起一个额外的HTTP请求。
我希望通过以上的分享,可以阐明HTTP重定向的工作方式以及在哪种情况下选择哪种HTTP状态代码。
参考
原文:301, 302, 303, 307, and 308: Which HTTP Redirect Status Code is for What?