首先,什么是HTTP缓存,先大概说一下。
Http缓存分两种,一种强制缓存,一种协商缓存。
一般Http只能缓存get请求返回的资源,然后
Http缓存发生在第一次请求之后,(不包括第一次哦)
第一次正常请求,服务器返回资源。
从第二次请求开始,浏览器进行请求参数的判断,如果命中了强制缓存,则状态码200,在本地缓存中直接读取资源。否则则会发起请求,服务器经过请求头中的缓存参数进行判断是否命中协商缓存,如果命中协商缓存,则不返回资源,状态码返回304,从本地缓存中读取资源,其他情况则服务器返回资源。
下边稍微深入点说说上边的细节,
那么上边说了通过请求头的参数判断 强制缓存 / 协商缓存, 那么是哪些参数呢?
强制缓存: Pragma, CaChe-Control, Expires
协商缓存: ETag/if-Not-Match, Last-Modified/if-Modified-Since
Pragma
可选值:no-cache(不直接使用缓存,根据新鲜度来使用缓存)
注意点:
1.它的优先级是最高的;
2.响应头 不支持这个属性;
3.在HTTP/1.1中已经被废弃了
Cache-Control
可选值:
1.no-cache(不直接使用缓存,根据新鲜度来使用缓存)
2.no-store(不使用缓存,每次都是请求下载新资源)
3.max-age:xx秒(缓存时长)
4.public/private(是否只能被单个用户使用,默认是private)
5.must-revalidate(每次访问需要缓存校验)
注意点:
1.它的优先级次于Pragma
2.用于HTTP/1.0之后(不包含1.0)
3.在缓存未失效前,获取不到修改后的资源
Expires
可选值:GMT时间
注意点:
1.它的优先级在强制缓存中是最低的
2.在缓存未失效前,获取不到修改后的资源
3.可用于HTTP版本 1.0+
接下来就是协商缓存,协商缓存有两组,ETag / if-not-Match 是一对
第一次请求之后服务器返回数据,在返回头中有ETag属性,ETag的值是一个由服务器端生成的一个序列值,一般是个hash值,然后在客户端下一次请求此数据的时候会在请求头中携带上if-not-Match属性,值则是Etag返回的那个值,服务器收到请求后会对比此值是否相同,来判断是否需要返回新的资源。它非常的精准,可以计算一秒内的多次修改,但是它的计算会耗费性能。
另外一组是 last-Modified / if-Modified-Since
第一次请求之后服务器返回数据,在返回头中有last-Modified属性,last-Modified的值是GMT格式的时间,代表着资源最后一次修改的时间,然后在客户端下一次请求此数据的时候会在请求头中携带上last-Modified-Since属性,值则是Last-Modified返回的GMT时间,服务器收到请求后会对比此值是否相同,来判断是否需要返回新的资源。它以秒为单位,监听不到在一秒内的多次修改,所以不是绝对精确。