HTTP的重定向和跳转

重定向

当我们链接URL的时候,URL会发起一个新的HTTP请求,获取响应报文后就会切换显示内容,渲染出新的URL界面
这样的跳转的动作是由浏览器的使用者主动发起的,可以称为主动跳转,但是还有一类跳转是有服务器发起的,浏览器的使用者无法控制,相对的可以称为被动跳转,这在HTTP的协议里有个穿有名字:重定向

重定向的过程

一次重定向实际是发送了两次HTTP请求,第一个请求返回了302,然后第二个请求被重定向到对应的网址上,整个过程用户是无感的。
“Location”字段属于响应字段,必须出现在响应报文里。但只有配合 301/302 状态码才有意义,它标记了服务器要求重定向的 URI,这里就是要求浏览器跳转到“index.html”。
浏览器收到 301/302 报文,会检查响应头里有没有“Location”。如果有,就从字段值里提取出 URI,发出新的 HTTP 请求,相当于自动替我们点击了这个链接。
在“Location”里的 URI 既可以使用绝对 URI,也可以使用相对 URI。所谓“绝对 URI”,就是完整形式的 URI,包括 scheme、host:port、path 等。所谓“相对 URI”,就是省略了 scheme 和 host:port,只有 path 和 query 部分,是不完整的,但可以从请求上下文里计算得到

重定向状态码

最常见的重定向状态码是301和302,另外还有几个不常见的,比如303,307,308等,不过最终效果都差不多,让浏览器跳转到新的URL上,但是语意上有细微差别。

  • 301: 俗称永久重定向,原来URL已经永远的不存在了,后面所有的请求都必须改用新的URL
  • 302: 俗称临时重定向,意思是原来URL处于临时维护状态,新的URL是起到顶包”作用的“临时工”。
  • 303:类似302 但是眼球重定向后改为GET方法,访问一个结果界面
  • 307:类似于302 但是重定向后请求里的方法和实体不允许变动
  • 308:类似307不允许重定向后请求变动
重定向的应用场景

使用重定向跳转,核心是要理解“重定向”和“永久 / 临时”这两个关键词。
先来看什么时候需要重定向
一个最常见的原因就是“资源不可用”,需要用另一个新的 URI 来代替
至于不可用的原因那就很多了。例如域名变更、服务器变更、网站改版、系统维护,这些都会导致原 URI 指向的资源无法访问,为了避免出现 404,就需要用重定向跳转到新的 URI,继续为网民提供服务。
另一个原因就是“避免重复”,让多个网址都跳转到一个 URI,增加访问入口的同时还不会增加额外的工作量。

重定向相关问题
  • 性能损耗:虽然 301/302 报文很小,但大量的跳转对服务器的影响也是不可忽视的。站内重定向还好说,可以长连接复用,站外重定向就要开两个连接,如果网络连接质量差,那成本可就高多了,会严重影响用户的体验
  • 循环跳转:如果重定向的策略设置欠考虑,可能会出现“A=>B=>C=>A”的无限循环,不停地在这个链路里转圈圈,后果可想而知

你可能感兴趣的:(HTTP的重定向和跳转)