浏览器缓存机制

235 阅读2分钟

浏览器缓存分为强制缓存(本地缓存)和协商缓存

两者区别在于,强制缓存使通过设置一些限制规则来判断缓存是否过期,协商缓存是通过比较服务器和本地资源是否有更新来判断缓存

强缓存的优先级高于协商缓存,只有强缓存失效了才会进入协商缓存的判断。

强缓存

http1.0

http1.0 中,强缓存通过 expires 字段来控制,这个时间是一个相对时间,expires 由资源在首次请求时返回在响应头中,在客户端再次发起请求时,请求时间超过了 expires 规定的时间,则重新请求资源,否则继续使用缓存。假如本机更新了时区或者修改了时间,会导致强缓存失效。

http1.1

http1.1 中使用 cache-contorl 字段来进行缓存控制,cache-contorl 字段提供了几种不同的规则:

max-age 失效时间
public 允许所有缓存(客户端和代理服务器缓存)
private 允许客户端缓存
no-cache 不使用本地缓存
no-store 禁止缓存

协商缓存

协商缓存根本上是比较资源是否变化,可以通过两种方式来比较

etag/if-no-match
资源标识符是否变化来决定返回200最新资源还是304继续使用本地资源

last modified/if-modified-since 
判断服务器修改时间来判断返回200最新资源还是304继续使用本地资源

优先级:Etag > Last modified
  1. 协商缓存必须和服务器建立连接,资源首次被请求 etag 等字段会被返回在 response headers 中。
  2. 资源再次请求时,会将旧的 etag 通过 if-none-match 字段发送给服务器
  3. 服务器进行判断,若相同,则设置 if-none-matchfalse,返回 304,否则返回 ture200 以及最新的资源