跳到主要内容

浏览器的缓存策略是什么?

浏览器的缓存策略主要分为强缓存和协商缓存。

一、强缓存

强缓存是在缓存期间,浏览器不会向服务器发送请求,直接从本地缓存中获取资源。

实现强缓存主要通过设置 HTTP 响应头中的 Cache-ControlExpires 字段。

  • Cache-Control:可以设置多种指令,比如 max-age 表示资源的缓存时间(以秒为单位);no-cache 表示不使用强缓存,但可以使用协商缓存;no-store 表示不进行任何缓存。
  • Expires:指定资源的过期时间,是一个绝对时间。但由于客户端和服务器的时间可能不同步,所以现在更常用 Cache-Controlmax-age 指令。

二、协商缓存

当强缓存失效时,浏览器会向服务器发送请求,服务器根据请求头中的信息判断资源是否有更新。如果资源没有更新,服务器返回 304 Not Modified 状态码,浏览器从本地缓存中获取资源;如果资源有更新,服务器返回新的资源和 200 OK 状态码。

协商缓存通过设置 HTTP 响应头中的 Last-ModifiedIf-Modified-Since 字段,或者 ETagIf-None-Match 字段来实现。

  • Last-ModifiedIf-Modified-SinceLast-Modified 表示资源的最后修改时间,服务器在响应资源时设置这个字段。浏览器在下次请求时,在请求头中带上 If-Modified-Since,其值为上次响应头中的 Last-Modified 的值。服务器比较这两个时间,如果资源没有更新,返回 304 状态码。
  • ETagIf-None-MatchETag 是资源的唯一标识,服务器在响应资源时设置这个字段。浏览器在下次请求时,在请求头中带上 If-None-Match,其值为上次响应头中的 ETag 的值。服务器比较这两个值,如果资源没有更新,返回 304 状态码。ETagLast-Modified 更加准确,因为它可以基于资源的内容生成,而不仅仅是修改时间。

浏览器在获取资源时,首先检查强缓存,如果强缓存有效,直接使用本地缓存;如果强缓存失效,再检查协商缓存。如果协商缓存也失效,浏览器才会向服务器发送请求获取新的资源。