工作原理
当方法是可缓存的(通常是 GET 或 HEAD)且响应允许时,缓存可以存储响应。新鲜度由 Cache-Control: max-age 或 s-maxage,或 Expires 计算。新鲜期内,缓存直接返回副本,不联系源站。
HTTP/1.1 200 OK
Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=30
ETag: "v42"
过期后,缓存用 If-None-Match 或 If-Modified-Since 重新验证:304 Not Modified 刷新新鲜度且不带响应体,200 则替换条目。private 阻止共享缓存存储,no-store 完全禁止存储,immutable 告诉浏览器无需再验证。
何时使用与取舍
HTTP 缓存适用于静态资源、公开内容和能容忍短暂过期的 API 读请求。带指纹的静态资源 URL 可以缓存一年;个性化或已认证响应需要 private 或 no-store,敏感数据绝不能进入共享缓存。
激进缓存降低延迟和源站负载,但会让更新可见性变差;按 URL 清除缓存在不同缓存之间不可移植。没有指纹却设置长 max-age 会把用户困在旧内容上;Vary 头可能让缓存键爆炸;反过来,到处 no-cache 会浪费协议最大的性能杠杆。每次策略变更前后都应测量命中率和源站延迟,因为浏览器、代理和 CDN 的行为并不相同。
示例与误解
经典生产事故:API 返回用户相关的 JSON 却没有 Cache-Control: private,CDN 将其缓存,下一个用户看到别人的数据。修复方式是显式缓存策略,以及检查响应头而不只是响应体的测试。相关概念:旁路缓存、缓存失效、缓存击穿。