前言:前面介绍了http强缓存,这里继续介绍一下http的协商缓存;
什么是协商缓存?
协商缓存相对于强缓存的不同之处在于,协商缓存在确定使用磁盘缓存之前,需要先向服务端发送一个请求,确定是否可以使用缓存,如果可以使用缓存,浏览器就直接读取缓存并返回。
协商缓存过程
协商缓存标志
Last-Modified & If-Modified-Since
Last-Modified:服务器端返回给客户端当前请求的资源的最后修改时间;
If-Modified-Since:客户端将上一次请求的Last-Modified作为该参数返回给服务器端;
举例:
last-modified: Wed, 28 Apr 2021 18:58:18 GMT
if-modified-since: Wed, 28 Apr 2021 18:58:18 GMT
last-modified是一个服务器的绝对时间,最小单位是S(秒),当服务器文件发生改变,它的值也会跟着变化;但last-modified控制缓存的缺陷在于,当文件改变频率小于S级别时,它将无法识别变化,客户端将继续使用缓存,导致无法及时更新的问题。
etag将解决这个缺陷,下面将提到。
Etag & If-None-Match
etag:服务器端返回根据文件生成的hash值;
if-none-match:客户端将上一次请求的etag作为该参数返回给服务器端;
etag是根据文件生成的hash值,最小有效时间单位是ms(毫秒),将解决last-modified无法识别小于S(秒)级别的文件改变。当服务发现etag值没有改变,将告诉客户端直接使用缓存。
优先级
当last-modified 与 etag 同时存在时,etag > last-modified;也就是说,etag存在时,last-modified将不生效;
当强缓存生效时,协商缓存将不生效;