Https中301,302,303,307那些事

1 各大网站https跳转表现概览

1.1 baidu.com

Alt text

多次访问,会直接200到https://www.baidu.com

1.2 tmall.com

Alt text

多次访问,表现同上图一致

1.3 wenku.baidu.com

Alt text

多次访问,表现同上图一致

1.4 jd.com

Alt text

多次访问,会直接200到https://www.jd.com

1.5 taobao.com

Alt text

多次访问,会直接200到https://www.taobao.com

2 表现归类

2.1 首次访问状态码

状态码目前看来集中在301、302、307三类状态

2.2 多次访问表现

部分域名比如说jd.com、taobao.com、baidu.com 都属于多次访问200状态码,不存在多次跳转。但是wenku.baidu.com、tmall.com 都会出现不管如何访问都有一次30x跳转的情况

3 301、302、303、307状态码那些事

HTTP1.0 介绍:RFC 1945 - Hypertext Transfer Protocol — HTTP/1.0 HTTP1.1 介绍:RFC 2616 - Hypertext Transfer Protocol — HTTP/1.1

3.1 302状态码

HTTP1.0阶段 : 客户端发出POST请求后,收到服务端302状态码后,不能自动向新的URL发送重复请求,部分浏览器会跟客户确认是否重发,因为第二次POST时,是非幂等请求,可能再次发送POST请求不符合用户预期。也有部分直接选择以GET形式重发。()

HTTP1.1阶段:客户端发出非GET、HEAD请求后,收到服务端的302状态码,那么就不能自动的向新URI发送重复请求,除非得到用户的确认。但是,很多浏览器都把302当作303处理了(注意,303是HTTP1.1才加进来的,其实从HTTP1.0进化到HTTP1.1,浏览器什么都没动),它们获取到HTTP响应报文头部的Location字段信息,并发起一个GET请求。

3.2 301状态码

HTTP1.0阶段:为客户端请求的资源分配一个永久链接。如果客户端发出的是POST请求,在收到服务端301状态码后,不可以自动新的URI发送跳转请求,除非得到用户的确认。也有部分的浏览器会直接以GET形式对请求做跳转。

HTTP1.1阶段:同1.0基本一致

3.3 307状态码

307状态码是HTTP1.0发布的。 官方称为:Temporary Redirect 临时重定向

文档中307状态码同HTTP1.0中的302状态码接近,当客户端的POST请求收到服务端307状态码响应时,需要跟用户询问是否应该在新URI上发起POST方法,307是不会把POST转为GET的。浏览器层面上也不会有此类行为

3.4 303状态码

这块官方文档说用的个人认为比较模糊,看起来同302没什么不同,目前大部分的浏览器都会把303当做302使用。但是更偏重于标识客户端应当以GET方式进行请求资源的获取,目前看来用该状态码的域名极少,还未找到。

3.5 小结

303和307是HTTP1.1新加的服务器响应状态码,是对HTTP1.0中的302状态码的细化,主要用在对非GET、HEAD方法的响应上。 303和307的存在,归根结底是由于POST方法的非幂等属性引起的,而302太通用,无法解决这类问题,虽然303和307目前看起来也并未很好解决,但显然是个解决的思路和趋势了,一定程度上能有区分。 301由于是永久跳转,所以对于seo的优化效果会更好,有seo需求的网站尽量选择301会好一点。 302的话一定程度上更便于做网络访问统计,但是本身更多程序员喜欢用302,很多语言也会提供类似location这样的302跳转。 nginx中也提供了不同的变量来标识不同跳转: redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时) permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url

在 GET、HEAD 这些幂等的请求方式上,302、303、307 没啥区别。 但是对于 POST 就不同了,大部分浏览器302会将 POST 请求转为 GET,而 303 是规范强制规定将 POST 转为 GET 请求,请求地址为 header 头中的 Location,307则不一样,规范要求浏览器继续向 Location 的地址POST 内容。

4 HSTS是什么?

多次输入表现均同上一致,这个现象是因为使用HSTS,该功能会新起一篇文章来具体总结下,不在这里描述了,感兴趣的自查即可,维基百科有详细的说明。