浏览器缓存分为强缓存和协商缓存。发起请求时先看强缓存:根据响应头 Cache-Control(如 max-age=3600,优先级更高)或 Expires(HTTP/1.0 的绝对时间,受本地时钟影响)判断是否新鲜,命中则直接用本地缓存,不发请求,状态码通常是 200(from disk/memory cache)。

强缓存过期后进入协商缓存:带上 If-Modified-Since(对应响应头 Last-Modified)或 If-None-Match(对应 ETag,优先级更高,精度也更高,因为 Last-Modified 只精确到秒且文件改了内容未必变)请求服务器。服务器比对后:未变则返回 304 Not Modified,浏览器用本地缓存;变了则返回 200 和新资源。

要点:ETag 是内容标识,比时间戳更可靠,但生成有计算成本。Cache-Control 常用值:no-cache(每次都要协商)、no-store(完全不缓存)、immutable、public/private。实践中静态资源用带 hash 的文件名 + 长 max-age + immutable,HTML 用 no-cache 保证更新及时。追问方向:memory cache 与 disk cache 的区别、CDN 缓存与浏览器缓存的协作、启发式缓存。