浏览器缓存机制是指浏览器在向服务器请求资源时,如果该资源已经被缓存,就不需要重新从服务器获取,而是直接从浏览器缓存中读取,以提高页面加载速度和减少网络流量。浏览器缓存机制主要分为两类:强缓存和协商缓存。
强缓存
强缓存指的是浏览器直接从缓存中获取资源,并且不向服务器发送请求。强缓存的优先级比较高,如果缓存命中,浏览器不会发送请求,直接从本地缓存中获取资源。浏览器通过在响应头中添加 Cache-Control 或 Expires 字段来控制强缓存的策略:
Cache-Control:该字段是 HTTP/1.1 中的一个规范,通过指定一个时间段,来控制资源在客户端的缓存时间。常见的取值包括:no-cache、no-store、public、private、max-age 等。
Expires:该字段是 HTTP/1.0 中的一个规范,通过指定一个过期时间,来控制资源在客户端的缓存时间。该字段的值是一个 GMT 格式的日期字符串。
协商缓存
协商缓存指的是浏览器向服务器发送请求,但是服务器通过比较资源的 ETag 或者 Last-Modified 字段来判断资源是否有更新,如果资源没有更新,则返回 304 Not Modified 状态码,通知浏览器可以直接从缓存中获取资源。协商缓存的优先级比较低,如果缓存命中,则仍然需要向服务器发送请求,但是服务器不会返回资源的实体内容,而是返回一个 304 Not Modified 状态码,浏览器根据该状态码从本地缓存中获取资源。浏览器通过在请求头中添加 If-Modified-Since 和 If-None-Match 字段来控制协商缓存的策略:
If-Modified-Since:该字段的值是上次请求中服务器返回的 Last-Modified 字段的值,表示客户端缓存的资源的最后修改时间。
If-None-Match:该字段的值是上次请求中服务器返回的 ETag 字段的值,表示客户端缓存的资源的唯一标识符。
需要注意的是,强缓存和协商缓存是互相独立的,浏览器在请求资源时,会优先检查强缓存,如果强缓存命中,则直接从缓存中获取资源,不需要向服务器发送请求;如果强缓存未命中,则检查协商缓存,如果协商缓存命中,则返回 304 Not Modified 状态码,否则从服务器重新获取资源。