浏览器的缓存机制又叫做http的缓存机制 这个机制最核心的两点: 1.浏览器发生请求时,会先到浏览器缓存中查找该请求的结果和缓存标识; 2.浏览器每次接收到服务器的响应结果后,会把该响应结果和缓存标识存入浏览器缓存中
整个浏览器的缓存机制过程中,根据是否需要重新向服务器发送请求,划分为两个部分 ---- 强制缓存和协商缓存。
浏览器发生请求时,会先到浏览器缓存中查找该请求的结果和缓存标识 一般有以下三种情况: 1.该请求的结果和缓存标识不存在,直接向服务器发送请求,服务器响应结果,强制缓存和协商缓存不生效,此时服务器的响应报文中的http头存在两个字段,控制着该响应结果的缓存情况,1.expire(http/1.0)表示缓存的过期时间,这个时间是相对于服务器的设定的,当我们电脑的时间跟服务器的时间不一致时,容易造成强制缓存失效。2.cache-control(http/1.1),有多个取值:public(浏览器和服务器代理均会缓存) private(浏览器会缓存) no-store 不缓存 no-cache 浏览器会缓存,但是否使用这个缓存需要进行缓存协商 max-age=多少秒 缓存的有效时间。 cache-control的优先级比expire高,当同时存在时,只使用cache-control的值。 2. 该请求的结果和缓存标识存在,且都没失效。直接利用缓存,强制缓存生效。 3.该请求的结果和缓存标识存在,但已经过期,这时候浏览器会向服务发送请求判断,判断是使用缓存还是重新得到响应结果,这个过程叫做协商缓存。 判断过程:服务器的每次响应结果中带有一个字段 last-modified 表示服务器对该资源的最后一次修改时间,浏览器向服务发送请求判断的时候会带有一个字段 if-modified-since 值为last-modified的值,对服务器该资源的最后一次修改时间进行比较,若比服务器最后一个修改该资源的时间小,则重新获得请求,状态码为200,否则 使用缓存,状态码为304;
http/2.0这个版本中,使用的是Etag和if-non-match,Etag,是服务器根据当前资源状态生成的特定唯一的标签,只要资源已修改,该标签就会改变。
if-non-match 值为Etag的的值,跟服务器当前的标签相同时,则使用缓存,状态码为304,不相同时,从新获得请求,状态码为200。
Etag/if-non-match 的优先级比last-modified/if-modified-since 高。