Cache-Control配置需按资源特性匹配缓存意图:public允许多级缓存但须配max-age或immutable;immutable适用于带哈希的静态资源,跳过验证;no-cache允许缓存但每次需校验;private仅限浏览器缓存;no-store彻底禁用所有缓存。

配置 Cache-Control 头部不是堆砌指令,而是按资源特性匹配缓存意图。静态资源缓存的关键,在于让浏览器和 CDN 知道“谁可以存、存多久、要不要验证”,五种核心状态对应五类典型场景。
public:公开资源允许共享缓存
适用于 JS、CSS、字体、图片等不带用户信息的通用文件。CDN 和浏览器都能缓存,提升多用户访问效率。
- 必须搭配 max-age 或 immutable 才有实际缓存效果,单独写 public 不会延长有效期
- Nginx 中推荐写法:add_header Cache-Control "public, max-age=31536000";
- 避免用于含动态参数或用户标识的 URL(如
/avatar?uid=123),否则可能造成内容错乱
immutable:内容承诺永不变更
告诉浏览器“这个文件一旦缓存,整个生命周期内都不会变”,跳过协商缓存(ETag/Last-Modified 验证),彻底省掉 304 请求。
- 只适用于带哈希指纹的资源,例如
main.a1b2c3.js、style.f4e5d6.css - 必须与 long max-age 同时使用,常见组合:"public, immutable, max-age=31536000"
- 注意:Safari 早期版本支持不完整,但当前主流版本均已兼容
no-cache:可缓存但每次需验证
资源可以存在本地,但每次使用前必须向服务器发起条件请求(带 If-None-Match 或 If-Modified-Since)。适合内容可能更新、又不想完全放弃缓存收益的场景。
- 不是“不缓存”,而是“缓存+强制校验”,仍能节省带宽(304 响应无响应体)
- 常用于 HTML 页面或未加哈希的静态资源,例如首页、活动页等
- 建议搭配 must-revalidate:"no-cache, must-revalidate, max-age=0"
private:仅限用户终端缓存
禁止 CDN、代理等中间节点存储,只允许最终用户的浏览器缓存。适用于含用户上下文但不敏感的资源,比如带登录态的图标、个性化样式表。
- 不能用于纯静态资源(浪费 CDN 能力),也不适合高度敏感数据(应改用 no-store)
- 典型配置:"private, max-age=900"(缓存 15 分钟)
- 注意:如果后端已设置 private,Nginx 再 add_header 不会自动覆盖,需加 always 参数
no-store:彻底禁用任何缓存
所有环节(浏览器、CDN、代理、Service Worker)都不得保存副本。适用于支付页、密码修改页、含令牌的接口响应等强敏感内容。
- 和 no-cache 有本质区别:no-store 每次都走完整 200 响应,不复用任何本地副本
- 通常叠加其他指令增强语义,例如:"no-store, no-cache, must-revalidate"
- 不要滥用——它牺牲性能换取安全,仅在真实需要时启用










