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?

301、302、303、307 和 308:这个重定向的状态码都用来干啥的?相关推荐

  1. 详解重定向(HTTP状态码301/302/303/307/308)附案例

    关注 前端瓶子君,回复"交流" 加入我们一起学习,天天进步 今天打算好好把状态码301.302.303.307.308好好撸一遍,并会测试下一些例子. 状态码的解释 我们都知道重定 ...

  2. http 301 302 303 307 308 傻傻分不清

    http的重定向我们经常是张口就来,"小明,在nginx上做一个重定向就行了".整个流程非常简单,服务端HTTP返回码是30x,头里面的Location字段代表新的URL.如下图所 ...

  3. php 303,HTTP 的重定向301,302,303,307(转)

    301 永久重定向,告诉客户端以后应从新地址访问. 302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found. 现在使用只是为了兼容性的处理,包括PHP的默认L ...

  4. 【HTTP】http重定向301/302/303/307

    一.概述 重定向常常和请求转发放在一起讨论(前者是两次不相关的请求,后者是一次请求服务器端转发),然而本文并不讨论两者的区别,而是HTTP 1.0规范和HTTP 1.1规范中关于重定向的区别,以及实际 ...

  5. http中的301、302、307、308有什么区别?

    原文来自https://www.cnblogs.com/wuguanglin/p/redirect.html 状态码的解释 301 Moved Permanently(永久移动) 被请求的资源已永久移 ...

  6. [html] http中的301、302、307、308有什么区别?

    [html] http中的301.302.307.308有什么区别? 301:永久移动302:发现307:临时重定向308:永久重定向 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, ...

  7. http协议状态码3xx系列(301,302,303,304,305,306,307),小白易通

    3xx 重定向 3xx系列是http响应包中重要的状态标准,表示重定向意义的一类状态码,这些转状态码将指导客户端执行某些行为 都是属于重定向,但不同的值,差异却不小,具体差异如下 301 永久重定向 ...

  8. http 状态码 301 302 303 区别

    301 永久性重定向,该状态码表示请求的资源已被分配了新的URL,以后应使用资源现在所指的URL 302 临时重定向.表示请求的资源已被分配了新的URL,希望用户本次使用新的URL访问.和301相似, ...

  9. 302状态码_http状态码是什么?301 302 404的SEO应用场景

    什么是HTTP状态码?简单的讲,就是用以表示网页服务器HTTP响应状态的3位数字代码.其中1xx表示临时响应,2xx表示成功处理了请求,3xx代表重定向,4xx表示请求错误,而5xx表示服务器错误.除 ...

最新文章

  1. 关于Java中各种修饰符与访问修饰符的说明
  2. .NET特性:异步流
  3. IDA中的SIG应用
  4. Java黑皮书课后题第7章:***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来。当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测
  5. 机器学习物语(3):回归问题
  6. freemaker模板引擎使用详解
  7. length函数的头文件_Framebuffer 应用编程中涉及的 API 函数
  8. HEU 5039 Move Woods
  9. Js判断是否在微信浏览器中打开和微信版本号
  10. LINUX 下安装 jdk 问题(please use alien to install rpm packages on Debian )
  11. js 数组 常用方法
  12. CA配置证书自动注册
  13. html box 竖线,【CSS】这种竖线效果如何实现呢
  14. Rails Controller中的concerns测试编写
  15. c语言循环语句学习心得
  16. 码题集新手村600道(前300道)
  17. 3.堆栈指针寄存器 SP 详解
  18. Java 开发者如何入门 Node.js 英文原文:Getting Started with Node.js for the Java Developer
  19. 团体程序设计天梯赛-习题集部分题解(大牛勿喷)
  20. 路由传参说有几种方式

热门文章

  1. checking for mysql_commit in -lmy_安装ruby环境,用mysql数据库,总是报错,调了一下午,网上方法都用了也不管事...
  2. 手把手教你学习IEC104协议和编程实现 八-协议的运行态(带时标的变位遥信及对时功能)
  3. 360安全,3Q大战一夜爆红
  4. 电商版3Q大战 815电商大战一周年祭
  5. 趣文|老舍:好读书,不求甚解
  6. 网络配置出错导致不能上网,如何重新启用以太网?
  7. PSD模版如何变成网页模版
  8. PG数据库 timestamp入库时间少8小时
  9. 项目中文乱码(jdk18乱码)
  10. Codeforces Round #529 (Div. 3) F(kul最小生成树)