重定向 Redirect 并非只有 301 和 302!

2019-10-1209:40:34 3 198
摘要

浏览器首先访问服务器A的URL,服务器A返回带着location为B的URL的 header 和3XX的状态码,浏览器读取响应的3XX状态码,获取到头部的 location,然后跳转到服务器B的URL。

说起重定向 Redirect 大家可能熟悉的也就是 301 和 302 了,并且重定向让很多小白站长们不明所谓,实在是太抽象了,明月自己也是很长时间才算是理解,今天又看到一篇有关重定向 Redirect 的好文章就迫不及待的给大家分享出来了,希望可以帮到大家!重定向 Redirect 并非只有 301 和 302!

重定向的流程

浏览器首先访问服务器 A 的 URL,服务器 A 返回带着 location 为 B 的 URL 的 header 和 3XX 的状态码,浏览器读取响应的 3XX 状态码,获取到头部的 location,然后跳转到服务器 B 的 URL。

需要知道的,跳转是浏览器发起的。如果服务器给一个非浏览器的终端返回了 3XX 的状态码,那有可能是无法完成重定向的。

某年,有个应该用已经运行很很长时间了,PHP 写的 API 接口。一直使用的是 HTTP,经常被劫持,然后领导想替换成加密的 HTTPS,但是客户端不能发版。后来服务器端就考虑把全站的接口从 HTTP 302 到 HTTPS,讨论这个方案的可行性。如果知道上面的流程和知识这个方案立马就 PASS 了。重定向 Redirect 并非只有 301 和 302!

永久重定向

表示资源永久性的跳转到新的 URL。

一个比较常见的案例就是老站迁移到新站,老站直接关闭后,老站的页面已经被搜索引擎收录了,这个时候使用永久重定向方案。

永久重定向两个状态码

  • 301,重定向请求通常会使用 GET 方法,不管原请求使用的是何种方法。
  • 308,为了补充 301.重定向必须使用原请求的方法和包体访问。

临时重定向

表示资源只是临时跳转到新的 URL

临时重定向一共有五个状态码,常用也就相对应的两个 302 和 307.

  • 302,重定向请求通常会使用 GET 方法,不管原请求使用的是何种方法。
  • 303,并不表示资源变更,只是表示用新的 URL 的响应代替原请求。不管原请求使用的是何种方法。基本跟 302 一致,所以市面很少用 303,都是使用 302.
  • 307,为了补充 302.重定向必须使用原请求的方法和包体访问。

百度就是使用的 307 跳转,浏览器输入 http://www.baidu.com 会 307 到 https://www.baidu.com

300,该请求有多种可能的响应,浏览器可以选择它们其中的一个。服务器没有任何标准可以遵循去代替用户来进行选择。

304,告诉浏览器,所请求的内容距离上次访问并没有变化。 可以直接从浏览器缓存里获取该资源。

后面两种不常用。

使用比较多就是 301 302 307 308

重定向 Redirect 并非只有 301 和 302!

循环重定向的问题

ERR_TOO_MANY_REDIRECTS

这个报错挺常见的。如果访问 A 页面然后重定向访问 B,然后 B 又让重定向访问 A,这样就是循环重定向了。多次重定向也会报这个错。

生产环境遇到过一次,有一次日志上发现有 ERR_TOO_MANY_REDIRECTS 的报错,但是在 Nginx 的配置上没有找到 3XX 的跳转代码啊,那怎么循环跳转的。后来看到了这段配置

location / {

try_files $uri $uri/ /index.html$is_args$args;

}

后来发现根目录下没有 index.html,uri 不存在,然后 uri/目录也不存在,最后发起一个内部子请求到 index.html.index.html 不存在,又到 location,反复重定向。最后报错 ERR_TOO_MANY_REDIRECTS。

历史文章推荐:

  • 本博客公众号
  • 扫一扫关注!
  • weinxin
  • 本博客小程序
  • 微信内浏览本博客
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:3   其中:访客  2   博主  1

    • WEBXYZ WEBXYZ 1

      过来遛一遛~