HSTS 不影响 proxy_cache 缓存逻辑,其仅在浏览器侧强制 HTTPS;真正导致缓存失效的是上游 Cache-Control 头或 Nginx 的 proxy_ignore_headers、proxy_cache_valid 配置冲突,HSTS 必须仅在 HTTPS server 块中配置。

排查 Nginx 中 HSTS 与 proxy_cache 配合时和 Cache-Control 的冲突,核心在于理解三者作用时机与优先级:HSTS 是响应头(由浏览器强制执行,仅影响 HTTPS 重定向和证书校验),proxy_cache 是服务端缓存机制(依据响应头如 Cache-Control、Expires 决定是否缓存及缓存时长),而 Cache-Control 本身既可由上游服务生成,也可被 Nginx 主动覆盖或忽略。
确认 HSTS 头是否干扰缓存逻辑
HSTS(Strict-Transport-Security)本身不参与缓存决策,它只在浏览器侧生效,且仅在 HTTPS 响应中有效。但常见误区是:误以为 HSTS 导致“强制刷新”或“禁用缓存”。实际上:
- HSTS 不影响
proxy_cache是否存储响应 - Nginx 不会因存在 HSTS 头而跳过缓存或修改
Cache-Control - 若发现 HTTPS 接口缓存失效,真正原因大概率是上游返回了
Cache-Control: no-cache、must-revalidate或短max-age,而非 HSTS
检查 proxy_cache 是否忽略或覆盖了 Cache-Control
Nginx 默认尊重上游的 Cache-Control 头(例如 no-store、private 会阻止缓存),但可通过指令干预:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
proxy_ignore_headers Cache-Control Expires Set-Cookie;→ 会让 Nginx 忽略这些头,完全按proxy_cache_valid规则缓存 -
proxy_cache_valid 200 302 10m;→ 即使上游返回Cache-Control: max-age=5,Nginx 仍缓存 10 分钟 - 若同时配置了
proxy_cache_valid和proxy_ignore_headers,后者优先级更高,可能导致预期外的缓存行为
验证实际响应头与缓存状态是否一致
用 curl -I 对比原始上游响应与 Nginx 代理后响应,重点看三处:
- 上游直连(如
curl -I http://upstream:8080/api)→ 记录原始Cache-Control和Strict-Transport-Security - Nginx 代理后(如
curl -I https://example.com/api)→ 检查是否多出/少掉Cache-Control,HSTS 是否正常透传 - 查看 Nginx 缓存目录(如
/var/cache/nginx/xxx)中对应 key 的文件,用cat查看 meta 文件中的headers字段,确认缓存时记录的是哪套响应头
典型冲突场景与修复建议
常见真实问题不是 HSTS 引起,而是配置叠加导致语义矛盾:
- 上游返回
Cache-Control: private, max-age=300,但 Nginx 配了proxy_ignore_headers Cache-Control+proxy_cache_valid 200 1h→ 缓存时间远超业务预期,用户看到旧数据 - HTTPS 站点启用了 HSTS,但 Nginx 在 HTTP server 块中错误添加了
add_header Strict-Transport-Security ...→ 浏览器收到非 HTTPS 响应却带 HSTS,直接拒绝渲染(报错Refused to apply inline style because it violates...类似安全拦截),此时根本走不到缓存环节 - 修复方向:HSTS 只应在
listen 443 ssl的 server 块中添加;proxy_cache行为统一通过proxy_cache_valid和proxy_ignore_headers显式控制,避免依赖上游不可信头

















