强缓存:Expires
,Cache-Control
协商缓存:Last-Modified
,If-Modified-Since
和 ETag
,If-None-Match
ETag和Last-Modified:
- ETag相比于Last-Modified,它的精确度更高,因为当资源变化频率高于秒,Last-Modified就不准确了。
- 分布式场景中尽量关闭ETag,因为不同机器生成的会不一样。Last-Modified则需要保持一致。
第一次请求资源,服务器response中:
- expires 绝对时间,在客户端修改时间就可以引起问题
- Cache-Control max-age相对时间,客户端再根据自己的时间计算绝对时间
- Last-Modified 该资源在服务器上最后修改的时间,精确到秒(s)。在协商缓存时,服务器根据
request
中 If-Modified-Since 的值判断修改时间是否变化,未变化就返回304;变化了会在response
中更新 - ETag 该header表示的是服务器根据当前资源生成的一个唯一标识,只要资源变化该标识就会变化。在协商缓存时,服务器对比 If-None-Match 与根据当前资源生成的新ETag,同则304并发送刚刚的ETag;不同则返回资源内容。
当ctrl+f5
强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;
当f5
刷新网页时,跳过强缓存,但是会检查协商缓存