1.HTTP缓存的分类
强缓存和协商缓存
2.http缓存的大致形成过程:
(1)浏览器第二次发送网络请求,网络请求的http请求头部信息会被浏览器进行解析,如果浏览器查询请求头部信息(例如expire和cache-control里面的缓存有效时间),则命中强缓存,此时则不需要与服务器有任何关联,直接拿浏览器的缓存资源利用即可。
(2)如果请求头信息(Last_modify与if-Modify_since,ETag与if-none-match)验证过后浏览器证实过文件是有没有更新的,如果没更新,则服务器不会发送加载资源,浏览器直接拿缓存资源就行。
(3)如果协商缓存和强缓存都没有命中,则服务器需要将请求加载的资源发送给客户端。
总结:这里面说的缓存机制:强缓存-->协商缓存-->两者都没有,服务器再发送资源回来。
那么我们这里重点说一下expires和cache-control
1.expires:指的是缓存的有效日期,是服务器在响应头返回的具体时间点,例如:2023年4月20日 23:59:59,这是一个绝对时间的概念,也就是规定客户端到达这个时间后之后,发送这个请求时该缓存资源变为无效资源。
2.cache-control:指的也是缓存的有效时间,这也是服务器的一个具体时间点,cache-control:3600代表的是缓存资源的有效时间是3600秒,也就是从上一次(第一次)发送网络请求后开始计时,过了3600秒之后缓存资源无效,这是个相对时间的概念。
3.expires与cache-control
那么大家可能会想:既然有expires,为啥要cache-control呢?
仔细思考一下,如果我们修改了本地的客户端时间,那么如果此时利用服务器返回的expires去判断资源是否有效是不是可能会引起错乱。
而cache-control不会,因为它的有效时间段始终起止位置是根据客户端的时间来判断的,故不会产生偏差。
那么解释到这里我们就可以知道: cache-control如果在同一请求头同时设置,cache-control的优先级更高,会将expires覆盖。
4.Last-Modify与if-Modify-since
Last-Modify是浏览器在想服务器第一次发送网络请求,服务器给浏览器返回的一个响应头信息之一,它记录着服务器加载到的该文件最近更新的时间。 if-Modify-since是浏览器第二次发送同样一个网络请求的时候请求头携带的一个头部信息,它与第一次网络请求的响应头Last-Modify的值一致,与第一次服务器返回过来的Last-Modify进行比对,如果依旧一致,则说明第一次网络到第二次网络请求之间所有请求的资源未改变,则命中协商缓存。
5.ETag与if-None-Match
大家都知道,ETag与if-no-match的产生就是来弥补上面Last-Modify组合的一个缺陷(Last-Modify的时间精确度仅仅是到秒级而已,故如果一秒内请求资源发生了很多次更新的情况下【这在互联网环境是相当常见的】,就无法精准的利用到缓存,或者说容易导致缓存失误,进而发生信息滞后。)。 而ETag与if-None-Match是保证了请求资源标识的唯一性,也就是说,每一个不一样的请求都具有其唯一标识,如果请求的资源更新了,立刻会引起标识发生改变,ETag是客户端向服务器发送的第一次请求后服务器返回来的一个响应头信息,然后if-None-Match是客户端第二次向服务器发送请求时携带的请求头,也是通过上一次的ETag来赋值,发送给服务器校验最新的ETag,如果一致则说明所要请求的资源没有更新,命中协商缓存,服务器不需要发送请求资源。