今天下班的时候看到了一些重定向的基础知识,也算开了眼界。之前也常常使用301和302,但历来没有使用过和了解过其余的3XX的状态码,发现原来里面涉及的知识和解决的问题的还很多。html
浏览器首先访问服务器A的URL,服务器A返回带着location为B的URL的 header 和3XX的状态码,浏览器读取响应的3XX状态码,获取到头部的 location,而后跳转到服务器B的URL。
须要知道的,跳转是浏览器发起的。若是服务器给一个非浏览器的终端返回了3XX的状态码,那有多是没法完成重定向的。
某年,有个应该用已经运行很很长时间了,PHP写的API接口。一直使用的是HTTP,常常被劫持,而后领导想替换成加密的HTTPS,可是客户端不能发版。后来服务器端就考虑把全站的接口从HTTP 302到HTTPS,讨论这个方案的可行性。若是知道上面的流程和知识这个方案立马就PASS了。浏览器
表示资源永久性的跳转到新的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加密
ERR_TOO_MANY_REDIRECTS
这个报错挺常见的。若是访问A页面而后重定向访问B,而后B又让重定向访问A,这样就是循环重定向了。屡次重定向也会报这个错。日志
生产环境遇到过一次,有一第二天志上发现有ERR_TOO_MANY_REDIRECTS的报错,可是在Nginx的配置上没有找到 3XX的跳转代码啊,那怎么循环跳转的。后来看到了这段配置code
location / { try_files $uri $uri/ /index.html$is_args$args; }
后来发现根目录下没有index.html,uri不存在,而后uri/目录也不存在,最后发起一个内部子请求到index.html.index.html不存在,又到location,反复重定向。最后报错 ERR_TOO_MANY_REDIRECTS。htm