http 状态码之3xx

概述

http  状态码是http 协议中服务端返回给客户度的响应,根据状态码得知请求的情况以及服务端的情况。状态码分为2xx  3xx  4xx  5xx

3xx介绍

3xx 是重定向相关的状态码,通常作为一个中间态。主要有 301 302  303 304 307这几种。其中301 302 是http1.0 定义的,303 304 307 是http1.1 定义的,注意为了兼容性http1.1 也有301 302 。

303 和307 它们是对HTTP1.0中的302状态码的细化,在HTTP1.1中,302理论上是要被放弃掉的,它被细化为303和307,但为了兼容,它目前还在业界中大量使用。

301和302本来在规范中是不允许重定向时改变请求方法的(将POST改为GET),但是许多浏览器却允许重定向时改变请求方法(这是一种不规范的实现)。

303的出现正是为了给上面的301,302这种行为作出个规范(将错就错吧),也就是允许重定向时改变请求方法。此外303响应禁止被缓存。大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端

处理303响应时应当做的,所以303基本用的很少,一般用302。 307和308的出现也是给上面的行为做个规范,不过是不允许重定向时改变请求方法

重定向

所谓重定向就是,当浏览器向服务端发送url 请求的时候返回状态码为30x 时表示请求被重定向了,例如请求时http://www.a.com 返回的请求头中location:https://www.a.com 那么客户端就要重新根据location 提供的信息重新发起新的请求。例如在外网的ingress  配置http 强制跳转https 的时候就是通过配置301强制跳转的。

301  永久重定向

nginx  配置 rewrite permanent 就是这个效果

 

302  临时重定向

HTTP1.1和HTTP1.0的302状态码意义是一样的,浏览器对它的处理也是一样的。POST方法的重定向在未询问用户的情况下就变成GET,这种不符合文档规范的问题依然存在。

303  

303状态码的响应,也就是现在浏览器对302状态码的处理:POST重定向为GET

304    Not Modified  

该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但是从缓存获取资源

客户端在请求一个文件的时候,发现自己有该请求之前的缓存的文件,并且记录了 Last Modified ,那么在请求头中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。服务端只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。在服务端的返回的响应头中通常有Last Modified 如果此值与请求头中的 If Modified Since时间一致那么返回就是304,否则就是200。 对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。 因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。 实验: 请求一个静态文件网站,第一次返回200 ,F5刷新每次都是304 ,ctrl+F5 强制刷新就会200 发起新的请求而忽略缓存。

307  Temporary Redirect(临时重定向)

HTTP1.1文档中307状态码则相当于HTTP1.0文档中的302状态码,当客户端的POST请求收到服务端307状态码响应时,需要跟用户询问是否应该在新URI上发起POST方法,也就是说 307是不会把POST转为GET的。

308  永久重定向

请求和所有将来的请求应该使用另一个URI重复。 307和308重复302和301的行为,但不允许HTTP方法更改。

永久(Permanent)和临时(Temporary)的区别

永久是指原来访问的资源已经永久删除啦,客户端应该根据新的URI访问重定向。

临时是指访问的资源可能暂时先用location的URI访问,但旧资源还在的,下次你再来访问的时候可能就不用重定向了。

故301与302的区别:

301表示搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

 

posted @ 2020-06-29 11:45  fanggege  阅读(3923)  评论(0编辑  收藏  举报