KNOWLEDGE ARTICLE
HTTP 缓存 是什么?
Cache-Control、ETag、Last-Modified
通过响应标头控制浏览器和中间节点复用资源的方式。
核心解释
Cache-Control 规定缓存范围与时长,ETag 和 Last-Modified 可用于协商验证。合理策略能减少重复传输,但动态或私密内容需要更谨慎的缓存边界。
HTTP 缓存如何减少重复传输
HTTP 缓存允许浏览器、共享代理和 CDN 复用以前的响应。Cache-Control 用 max-age、s-maxage、public、private、no-cache、no-store 等指令定义新鲜度与存储范围;Expires 提供较早的绝对时间方式。合理缓存能降低延迟、带宽与源站压力。
no-cache 并不等于完全不存储,而是复用前需要向服务器验证;no-store 才表示不应存储响应。private 限制共享缓存复用,适合用户个性化内容;public 可以明确允许共享,但仍需确保响应没有敏感差异。
新鲜度与条件请求如何协作
- 缓存对象仍在 max-age 内时可直接使用;过期后可发送 If-None-Match 或 If-Modified-Since 进行条件验证。
- ETag 标识响应版本,Last-Modified 使用更新时间;服务器确认未变化时返回 304,不再传输完整正文。
- Vary 告诉缓存哪些请求头会改变响应,例如 Accept-Encoding 或语言;遗漏可能串内容,维度过多则降低命中率。
- stale-while-revalidate 和 stale-if-error 可在后台刷新或源站异常时短暂使用旧内容,改善体验但需要业务接受陈旧窗口。
个性化页面最需要防范什么
如果缓存键没有包含会改变内容的 Cookie、Authorization、地区或实验参数,共享缓存可能把一个用户的响应返回给另一个用户。登录页、购物车和账户数据应明确 private 或 no-store,并验证 CDN 规则不会覆盖源站意图。
静态文件常用带内容哈希的文件名和长缓存,HTML 则采用较短缓存或验证,以便及时引用新资源。发布流程应先上传新文件再更新 HTML,避免旧页面引用已经删除的资源。
实际应用与信息解读
响应标头可以直接说明浏览器与共享缓存的声明策略,Age、Via 或平台字段还能提供当前命中线索。性能效果仍需结合真实命中率、对象大小和网络指标,不能由一个 max-age 单独判断。
没有显式 Cache-Control 时,客户端可能进行启发式缓存,因此不能简单写成完全不缓存。敏感内容是否安全还要检查 CDN 配置与不同登录状态的实际响应。
重点关注
看见某个缓存标头不能直接判断页面性能;还应结合资源类型、CDN 命中、压缩和实际加载指标。
常见问题
no-cache 和 no-store 一样吗?
不一样。no-cache 允许存储但复用前需验证;no-store 表示不应保存响应。
缓存时间越长网站越快吗?
静态且版本化资源通常受益,但动态或用户内容长缓存可能陈旧甚至串数据,应按资源类型设计。
为什么更新页面后用户仍看到旧内容?
可能是浏览器、CDN、服务工作线程或中间代理缓存未过期,也可能清除规则没有覆盖当前缓存键。