浏览器缓存位置有Service Worker
、Memory Cache
、Disk Cache。
当浏览器要请求资源时,会依次查看 Service Worker
、memory cache
、disk cache的本地缓存
,最后会通过网络请求检查缓存,有强制缓存且未失效,则使用强制缓存(code:200);强制缓存失效则使用协商缓存,服务端比较后返回 304 或者 200(并携带资源)。
强制缓存
http1.0 响应头设置强制缓存 Pragma: no-cache;
http1.0 响应头设置强制缓存 Cache-Control: max-age=3600 | no-cache | no-store | public | private;
- max-age=0: 资源缓存的最大时间, 检验 ETag / Last-Modified
- no-cache, 会缓存内容,每次会发起请求,是否使用此内容由后续的对比决定;需要用另一种缓存策略来验证缓存(ETag,Last-Modified)
- no-store 不缓存直接发起请求
缓存开关优先级:
Pragma
> Cache-Control
> Expires(本地时间可能和服务器时间不一致)
协商缓存
协商缓存和没有缓存在请求数量上和没有缓存并无差异,区别在于状态码及返回内容。有缓存时,状态码为304,没有实际的内容,响应内容体积大大节省了。
设置协商缓存有Etag 和 Last-modify
Etag <----> If-None-Match,Etag依赖浏览器web service哈希算法计算得到hash值,(服务端返回Etag哈希值,客户端请求头If-None-Match携带来比较,不同浏览器可能计算不同不建议
Last-modify<----->If-Modify-since。服务端通过Last-Modified字段返回。客户端请求头If-Modified-Since或者If-Unmodified-Since带上Last-Modified。以s 为单位
缓存校验优先级:
Expires > Etag > Last-modified