浏览器缓存分为强制缓存(本地缓存)和协商缓存
两者区别在于,强制缓存使通过设置一些限制规则来判断缓存是否过期,协商缓存是通过比较服务器和本地资源是否有更新来判断缓存
强缓存的优先级高于协商缓存,只有强缓存失效了才会进入协商缓存的判断。
强缓存
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
- 协商缓存必须和服务器建立连接,资源首次被请求
etag等字段会被返回在response headers中。 - 资源再次请求时,会将旧的
etag通过if-none-match字段发送给服务器 - 服务器进行判断,若相同,则设置
if-none-match为false,返回 304,否则返回ture和200以及最新的资源