第一种:Last-Modified/If-Modified-Since
如果在服务器设置一个响应头 Last-Modified:该资源的更新时间
,然后浏览器收到这个响应头以后,下次再请求这个资源的时候,会带上请求头 If-Modified-Since:上次从服务器缓存该资源的时间
。服务器收到这个请求头以后会将两个时间点进行判断,如果服务器的时间更新,那么返回完整的响应数据,状态码为200,反之则只返回一个状态码为304的响应头域。
有个相对的首部为 If-Unmodified-Since
第二种:ETag/If-None-Match
同理服务器返回给浏览器的响应头 ETag:文件标识符
,浏览器收到后下次会发送一个请求头 If-None-Match:值为收到的ETag
,服务器会判断两个值是否相等,结果同上。
有个相对的首部为 If-Match
第三种:Expires
Expires:缓存时间
是由服务器设置的响应头,它告诉浏览器到什么时间缓存的副本失效。
第四种:Cache-Control
这个响应头有四个值,分别为:public(可以公开被缓存的文档),private(代理服务器不能缓存),no-cache(可以缓存但不能重用,意思是可以在浏览器“前进”“后退”时使用,真正加载时不可用),no-store(不允许缓存),前两个头可以和max-age以及must-revalidate一起使用。
如Cache-Control: max-age=3600 表示一小时内副本都是新鲜的。
而Cache-Control: must-revalidate 表示严格执行缓存新鲜度检查。
请求头有如下值:
Cache-Control: max-stale 缓存随意提供过期的文件
Cache-Control: max-stale=x(s) 这段时间内,文档不过期
Cache-Control: min-fresh=x(s) 至少时间内,文档必须保持新鲜
Cache-Control: max-age=x(s) 最多缓存的时间
Cache-Control: no-cache 不接受已缓存资源
Cache-Control: no-store 从存储器中删除文档所有痕迹
Cache-Control: only-if-cached 只有当缓存中有副本时,才获取
当我们点击Refresh(刷新)按钮时,浏览器会对请求添加一个Cache-Control的首部,强制进行再验证,或者直接从服务器获取文档,但这个会随浏览器的行为而定。