目录
前言
一、状态码
二、304状态码
浏览器服务器交互过程:
总结
前言
在发送http请求报文后,会返回一个响应报文,响应报文中含有一个状态码,这个状态码很重要,是来告知对应请求执行成功或是失败,以及失败的原因。
一、状态码
返回的状态码有三位数字,第一个数字定义了响应的类别,有五种可能的取值:
1XX: 指示信息,表示请求已接收,继续处理;
2XX: 成功,表示请求已被成功的接收;
3XX: 重定向,要完成请求必须进行更进一步的操作;
4XX: 客户端错误,请求有语法错误或请求无法实现;
5XX: 服务器错误,服务器未能实现合法的请求。
常见的状态码:
200:这是最常见,客户端请求成功。
400:客户端请求有语法错误,不能被服务端所理解。
401:请求未经授权。
404:请求资源不存在,输入了错误的URL。
500:服务器发生不可预期的错误。
503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
二、304状态码
如果客户端发送了一个带条件的GET请求,并且请求已被允许,而请求的文档的内容自上次访问以来或根据请求的条件,没有发生改变,则服务器返回304状态码。
当客户端向服务端请求数据,服务端返回后将数据存储在缓存中,下一次请求同样的数据时,服务端会返回304状态码,客户端就从缓存中请求数据。这样会提高浏览器的运行速度,节约资源。
HTTP/1.1定义的Cache-Control头用来区分对缓存机制的支持情况,请求头和响应头都支持这个属性,通过它提供的不同的值来定义缓存策略。
Cache-Control: no-store
没有缓存。
Cache-Control: no-cache
有缓存但需要重新验证:每次有请求发出时,缓存会将请求发送到服务器,服务器会验 证请求中所描述的缓存是否过期,未过期,就是返回304,这时缓存才使用本地缓存副本。
Cache-Control: public
公共缓存,表示该响应可以被任何中间件(比如中间代理,CDN等)缓存。
Cache-Control: private
私有缓存,表示该响应只能被浏览器缓存。
Cache-Control: max-age=315360000
表示资源能够被缓存(保持新鲜)的最大时间。
第一次客户端发送请求,缓存中没有数据,所以发送到服务端,服务端返回200,设置max-age值,并将数据存到缓存中。
第二次客户端发送请求,浏览器根据http头信息来判断是否命中强缓存,如果命中直接使用缓存中的数据,并不会向服务端发送请求,返回值200.
第三次客户端发送请求,缓存检索到已有一个对应的陈旧资源,缓存会先将请求添加一个 If-None-Match头,然后发给目标服务器,以此来检查这个资源是否依然还算新鲜,若,服务器返回了304,则可以使用,从缓存中拿数据,节约资源,节省带宽。 若服务器通过If-None-Match或If-Modified-Since判断后发现已过期,那么会带有该资源的实体内容返回。
If-None-Match:服务器会根据If-None-Match判断缓存中数据是否可以使用,If-None-Match的⼯作原理是在HTTP Response中添加ETags信息;
If-Modified-Since,和 Last-Modified ⼀样都是⽤于记录⻚⾯最后修改时间的 HTTP 头
信息;
Last-Modified 是由服务器往客户端发送的 HTTP 头;
If-Modified-Since 则是由客户端往服务器发送的头;
ETag是服务器自动生成或由开发者生成的对应资源在服务器端的唯一标识符,目的是能够更加准确的控制缓存。Last-Modified和ETag的功能差不多,但ETag的功能更多,优先级也更高,Last-Modified和ETag可以一起使用,会优先验证ETag,一致的情况下,才会比较Last-Modified,绝对是否返回304。
浏览器服务器交互过程:
1、客户端请求一个页面(A)
2、服务器返回页面A,并给A加上一个ETag
3、客户端展示该页面,并将页面连同ETag一起缓存
4、客户端再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器
5、服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。
总结
本篇文章和大家分享一些对http缓存机制的个人理解,如果有问题希望大家可以指出。



