一、强缓存
优先级:Pragma > cache-control > expires
1、Pragma
http 1.0 有效,设置为no-cache 时表示禁止缓存
2、Expires
可设置为GMT时间,表示在改时间内请求缓存有效,比如 Thu, 14 Nov 2019 07:22:26 GMT 表示2019/11/14 07:22:26 之前有效
缺点:客户端时间和服务器时间可能不一致,客户端随意更改时间;容易忘记设置的过期时间
3、Cache-Control
a、Resquest Headers 可选值有:
no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached
b、Response Headers 可选值值:
public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age
no-cache 告诉客户端请求时,应先向服务器发起请求,服务器判断资源没有更新返回304,则从缓存中获取资源,否则返回200和新资源
no-store 告诉客户端禁止缓存,到服务器获取资源
max-age=xx 比如max-age=60,表示客户端距上一次成功请求到服务器60s内直接从缓存获取,超出60s后(与max-age设置为<或=0一样)请求服务器,服务返回304则从缓存取,文件改变了则200返回新资源;max-age=0与no-cache效果一样
public 浏览器和缓存服务器都可以缓存页面信息
private 浏览器可以缓存,代理服务器不可以
must-revalidate,对于客户端的请求,代理服务器需向服务器验证缓存是否过期
ps:如果cache-control设置了多个值,no-store 优先级最高,各个值关系图为:
二、协商缓存
优先级 Etag > Last-Modified
1、 Last-Modified/If-Modified-Since
原理为:
第一次请求资源,响应的response headers 返回 Last-Modified:Last-Modified: Wed, 16 Oct 2019 09:57:36 GMT 表示该文件最后更改的时间,精确到秒
第二次请求 request headers 带着if-modified-since:Wed, 16 Oct 2019 09:57:36 GMT ,服务器对比该文件最新改动时间,如果发现两个时间一致,返回304告诉客户端从缓存中获取,如果时间不一样则返回最新文件且response headers 中的Last-Modified 为最新时间。
2、Etag/If-None-Match
原理为:(与Last-Modified/If-Modified-Since差不多)
第一次请求资源,响应的response headers 返回Etag值,比如: Etag:W/"519-16dd4005e48",具体生成算法由服务端制定,一般可以为文件的hash值,如果文件改变改值会根据具体算法改变。
第二次请求资源,request headers 携带 if-none-match:W/"519-16dd4005e48",服务器用该值与Etag比较,如果一致返回304,不一致返回最新文件资源。
3、Etag与Last-modified:
last-modified 只能精确到秒,如果一秒内改变多次文件,则无法获取最新资源
Last-modified
三、总结
开关:Pragma/cache-control
校验:cache-control的no-cache,max-age;expires; Etag;Last-Modified