核心是按内容敏感性与使用者范围精确设置cache-control响应头:public允许多级缓存,private仅限浏览器,需结合location匹配、map动态策略及no-store强化敏感接口控制。

在 Nginx 中实现私有缓存与公共缓存的差异化响应控制,核心是**按内容敏感性与使用者范围,精确设置 Cache-Control 响应头**,而非依赖单一全局策略。浏览器和中间代理(如 CDN、公司网关)会严格遵循这些指令:private 表示仅终端用户浏览器可存,public 允许所有缓存节点存储。配置的关键在于“谁该看到什么缓存行为”,而不是“能不能缓存”。
区分资源类型决定缓存可见性
同一站点中不同资源天然具备不同缓存属性,需在 location 或 map 块中按扩展名或路径精准匹配:
-
前端静态资源(JS/CSS/图片/字体):内容公开、无用户状态,适合
public缓存add_header Cache-Control "public, max-age=31536000, immutable" always; -
用户专属接口(如
/api/user/profile):含 Cookie 或 Authorization,返回内容因人而异,必须设为privateadd_header Cache-Control "private, no-cache, must-revalidate" always; -
通用 HTML 入口(如
/或/app):常为 SPA 路由页,骨架固定但需动态注入用户信息,建议no-store或private+ 短期验证add_header Cache-Control "private, max-age=0, must-revalidate" always;
用 map 指令动态绑定缓存策略
当缓存策略需根据请求特征(如是否带认证头、是否含特定 Cookie)实时判断时,map 比硬编码 if 更安全高效:
http {
map $http_authorization $cache_policy {
"" "private, no-cache";
~^Bearer "private, max-age=60";
default "public, max-age=3600";
}
}
然后在 location 中直接引用:add_header Cache-Control $cache_policy always;
这样可避免在每个条件分支里重复写 add_header,也规避了 if 在 location 中的潜在陷阱。
禁用中间代理缓存敏感内容
即使设了 private,某些老旧代理仍可能忽略该指令。对高敏感接口(如支付结果页、个人数据导出),推荐叠加 no-store 强制禁止任何缓存:
add_header Cache-Control "private, no-store" always;- 配合
proxy_ignore_headers Cache-Control谨慎使用——仅当你明确要覆盖后端返回的错误缓存头时才启用,否则会破坏上游服务的缓存意图。
验证与调试要点
配置生效后,通过响应头确认实际输出,并观察不同客户端行为:
- 用
curl -I https://yoursite.com/api/user查看返回的Cache-Control值 - 在 Chrome DevTools → Network → Headers 中检查
Response Headers是否符合预期 - 注意:若同时设置
expires和add_header Cache-Control,后者优先;建议统一用add_header管理,避免冲突











