浏览器缓存读取规则

231 阅读2分钟

1. 检查是否命中强缓存

浏览器首先会检查该资源是否命中强缓存。如果命中,则直接从缓存中读取资源,并不会向服务器发送请求。在 HTTP 响应头中可以设置两个字段控制强缓存:Expires 和 Cache-Control。

其中,Expires 字段是一个绝对时间,表示过期时间点,如:

Expires: Fri, 31 Dec 2021 23:59:59 GMT

Cache-Control 字段则是一个相对时间,表示过期时长,如:

Cache-Control: max-age=31536000

当客户端第一次请求资源时,服务器在返回响应时会将这些字段一并返回。当浏览器再次请求该资源时,会根据这些字段判断该资源是否命中强缓存。

2. 发送请求到服务器

如果没有命中强缓存,则浏览器会发送请求到服务器,并在请求头中包含上一次的缓存标识,如 If-Modified-Since 和 If-None-Match。

其中,If-Modified-Since 是一个时间戳,表示上一次资源的修改时间;If-None-Match 是一个字符串,表示上一次资源的 ETag(Entity Tag),即资源内容的唯一标识符。

3. 检查是否命中协商缓存

服务器收到请求后,会根据 If-Modified-Since 和 If-None-Match 判断该资源是否命中协商缓存。如果命中,则返回 304 Not Modified 状态码,表示客户端可以继续使用上一次的缓存。

如果没有命中协商缓存,则服务器会返回最新的资源,并在响应头中包含新的缓存标识,如 Last-Modified 和 ETag。

4. 更新缓存

客户端收到新的资源后,会根据响应头中的缓存标识更新本地缓存,并按照新的缓存规则进行保存。