浏览器的缓存分为两类:强缓存和协商缓存
所谓的强缓存就是本地缓存,当请求资源的时候直接从本地缓存中调取资源,
而协商缓存则是由服务器来确定缓存资源是否可用
决定强缓存的两个重要字段是cathe-control和expires,expires的值为一个绝对时间的GMT格式的时间字符串,如果请求时间在expires之前则缓存可用,否则就会向服务器发送请求
cathe-control:max-age=number,该number是一个设定的有效期,根据第一次获取资源的时间加上该有效期就能计算出该资源失效的时间,如果请求时间在失效时间之前则则说明缓存依然可用
否则就要重新发送请求
协商缓存对应的是两组信息:Etag/if-none-match,last-modified/if-modified-since
last-modified / if-modified-since的值都是GMT格式的字符串,在第二次请求的资源时header头部就会携带if-modified-since值就是上次请求时返回的last-modified值,
服务器再次受到请求后,会根据传过来的if-modified-since和资源的最后修改时间对比,如果相同就直接返回304Notmodified,那么客户端就直接从缓存中获取数据,但是如果不同,那么就把新的资源返回给客户端。
Etag/if-none-match是服务器生成的每个资源的唯一标示符,一旦资源发生变化Etag就会发生变化,其判断过程与modified类似。
Etag主要用来解决两个问题:
一些服务器不能精确获取到最后文件修改的时间
某些文件的修改频率过于频繁,比如说是在秒一下的时间修改,但是if-modified-since的精确粒度是s,所以需要使用到Etag。
如果Etag和last-modified同时存在的话,那么优先检测ETag。