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 可在后台刷新或源站异常时短暂使用旧内容,改善体验但需要业务接受陈旧窗口。
HTTP 缓存从首次存储、新鲜命中到过期条件验证和 304 更新的生命周期
一个缓存响应的完整生命周期串联首次获取、新鲜命中、过期验证、304 与重新下载

个性化页面最需要防范什么

如果缓存键没有包含会改变内容的 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、服务工作线程或中间代理缓存未过期,也可能清除规则没有覆盖当前缓存键。

权威资料