HTTPS下需分别配置浏览器缓存与Nginx代理缓存:前者用Cache-Control/Expires控制客户端行为,后者需严格配置SSL验证四指令、合理设置cache_key及分级缓存策略,避免安全与一致性问题。

HTTPS 本身不阻碍缓存,但会让缓存配置更敏感——关键不是“能不能缓存”,而是“缓存谁的、按什么标识、是否安全、如何更新”。Nginx 在 HTTPS 场景下要同时处理两层缓存:浏览器端的响应头控制,以及 Nginx 自身对上游 HTTPS 后端的反向代理缓存。两者逻辑独立,必须分别配置,否则容易出现资源不更新、混合内容警告、用户数据错乱甚至敏感信息泄露。
区分两类缓存:浏览器缓存 vs 代理缓存
很多人混淆这两者,导致加了 proxy_cache 却发现 JS 还是没更新,或设置了 Cache-Control 却被 Nginx 忽略。
-
浏览器缓存:由 Nginx 向客户端返回的
Cache-Control、Expires等响应头控制,适用于所有 HTTPS 响应(静态资源、HTML、API)。配置用add_header或expires,例如:
location ~* \.(js|css|png|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable, max-age=31536000";
}
-
代理缓存(proxy_cache):Nginx 自己把从 HTTPS 后端(如
https://api.example.com)拿到的明文响应存起来,下次直接返回。它不依赖浏览器头,但必须显式开启 TLS 校验,否则可能跳过证书验证、复用错误会话。
HTTPS 反向代理缓存必须配全四项 SSL 指令
仅写 proxy_pass https://... 是不够的,默认会跳过证书校验(等同于信任所有证书)。以下四条需共存于同一 location 块中:
-
proxy_ssl_verify on;—— 开启上游证书验证 -
proxy_ssl_trusted_certificate /path/to/upstream-ca.crt;—— 指向纯净 PEM 格式的 CA 证书链(不含私钥) -
proxy_ssl_name "api.example.com";—— 显式指定期望的证书 SAN,尤其当proxy_pass用变量或 IP 时不可省略 -
proxy_ssl_server_name on;—— 强制发送 SNI,否则多数云后端会拒绝连接
另外建议禁用 TLS 会话复用:proxy_ssl_session_reuse off;,避免缓存复用导致证书校验绕过。
缓存键(proxy_cache_key)必须反映真实上下文
默认键 $scheme$host$request_uri 在 HTTPS 下虽含 https,但若忽略用户态信息,就会造成 A 用户的订单页被 B 用户命中。
- 带登录态的接口(如
/api/profile):在proxy_cache_key中加入$http_authorization或$cookie_token;注意先用proxy_set_header Authorization $http_authorization;透传请求头 - 静态资源(如
/static/app.a1b2c3.js):可不带用户字段,但必须保留$scheme和$host,防止 HTTP/HTTPS 混用触发 HSTS 报错或混合内容警告 - 剔除无意义参数(如
_t=123456789):用map预处理$args,避免同一资源生成大量碎片缓存
按敏感度分级设置过期与清理策略
不能所有 HTTPS 响应都套一个 proxy_cache_valid 200 10m。应结合路径、状态码和业务语义区分对待:
-
公开静态资源(
.js、.css、/images/logo.png):设长周期,如proxy_cache_valid 200 365d,配合构建时文件哈希和Cache-Control: public, immutable -
带用户数据的动态接口(
/api/user):建议proxy_cache_valid 200 5m,并启用proxy_ignore_headers Cache-Control,再由后端返回Cache-Control: private, max-age=300,让 Nginx 尊重该语义 -
高敏操作(
/auth/logout、/api/payment/submit):显式禁用缓存,配置proxy_no_cache $http_pragma $http_authorization和proxy_cache_bypass $http_pragma $http_authorization -
主动清理比被动过期更可靠:价格调整、权限回收等场景不能等缓存自然失效。推荐两种方式:
✓ 启用ngx_cache_purge模块,开放/purge/xxx接口供发布系统调用;
✓ 对关键页面(如用户首页)采用缓存键版本化,在proxy_cache_key中嵌入$cache_version变量


















