HTTP状态码(未完待续)

707 阅读5分钟

301 Moved Permanently(永久重定向)

该状态码请求的资源已被分配新的URI,以后应使用资源现在所指的URI(通过 Location 来重定向到正确的新位置)—— by图解HTTP

例子:

(1)客户端发出请求

GET /blog HTTP/1.1
Host: www.example.com

(2)服务器回应

HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index.asp

若用户已经把URIwww.example.com保存为书签,此时会按照 Location (本例中为:www.example.org/index.asp)重新保存该书签。

ps:定义来源于图解HTTP,例子来源于 wiki

302 Found(临时性重定向)

状态码302的理解

该状态码表示请求的资源被分配新的URI,希望用户 本次 使用新的URI访问。与301状态码相似,但302状态码代表的是临时的,将来还有可能发生改变。—— by图解HTTP

还是以上面说的保存书签为例,返回302状态码时,不会像301一样更新书签。

例子:

(1)客户端发出请求

POST /blog HTTP/1.1
Host: www.example.com

(2)服务器回应

HTTP/1.1 302 Found
Location: http://www.example.org/index.asp

(3)客户端浏览器自动发送请求

GET /blog HTTP/1.1
Host: http://www.example.org/index.asp

上面的例子描述的是浏览器目前是如何处理302状态码的,我们可以注意到在第(3)步中,它无视原先请求的POST方法,使用GET的方式访问 Location 中的URI。

RFC1945和RFC2068规范中不允许客户端在重定向时改变请求的方法(即原请求是post,则不能把它变成get,进行自动重定向) —— by图解HTTP

浏览器的实现与规范的不统一(对于get请求,是可以自动重定向的,并且与规范不冲突),因此在Http1.1中引入状态码303和状态码307来细化302。

302劫持(DNS劫持)

网上优秀的资源:

DNS劫持的场景:

场景1: 用户访问 https://www.weibo.com,而运营商获得浏览器请求后,直接返回302,并在Location中设置为带广告的网页地址,在该网页中再通过iframe打开用户原来访问的地址(也可以对返回来的网页,通过操作dom插入广告),如下图所示。

ps:图片来源于《http网络劫持与DNS劫持原理及预防》

场景2:

A站通过重定向到B站的资源xxoo,A站实际上什么都没做但是有一个比较友好的域名,web资源xxoo存在B站并由B站提供,但是B站的域名不那么友好,因此对搜索引擎而言,可能会保存A站的地址对应xxoo资源而不是B站,这就意味着B站出了资源版权、带宽、服务器的钱,但是用户通过搜索引擎搜索xxoo资源的时候出来的是A站,A站什么都没做却被索搜引擎广而告之用户,B站做了一切却不被用户知道,价值被A站窃取了。
  —— by【HTTP】http重定向301/302/303/307

出现DNS劫持的原因:

Http协议是明文的,监控客户发起的http请求,然后直接伪造一个302redirect,重定向到自己的服务器。因为它设备肯定比客户实际要访问的服务器要近,所以响应回来的也比正常响应快。浏览器只处理最快的那个响应,所以客户就被劫持了而晚到的真实响应却被默默地丢弃了。

解决的方式:

  • 使用Https
  • 监听 DOMNodeInserted事件,分析插入的dom

303

把HTTP 1.0规范中302的规范和实现拆分开,分别赋予HTTP 1.1中303和307,因此在HTTP 1.1中,303继承了HTTP 1.0中302的实现(即原请求是post,也允许自动进行重定向,结果是无论原请求是get还是post,都可以自动进行重定向) —— by【HTTP】http重定向301/302/303/307

307

307继承了HTTP 1.0中302的规范(即如果原请求是post,则不允许进行自动重定向,结果是post不重定向,get可以自动重定向)。—— by【HTTP】http重定向301/302/303/307

304 Not Modified

客户端发送的是“带条件的请求”,服务器允许访问该请求访问资源,但是条件未满足。当服务器返回304时,不会包含响应的主体内容。

带条件的请求(Http 条件请求):使用 Get方法 请求,请求报文中包含(if-match,if-none-match,if-modified-since,if-unmodified-since,if-range)中任意首部。

状态码304的意思是304的产生与浏览器缓存相关哟

参考文献

[1]【HTTP】http重定向301/302/303/307

[2]图解HTTP

[3]wiki http 301/302