Nginx在HTTPS下缓存需区分浏览器缓存与代理缓存:前者用add_header或expires设置Cache-Control/Expires头,后者需启用proxy_cache并严格配置proxy_ssl_verify、proxy_ssl_trusted_certificate、proxy_ssl_name、proxy_ssl_server_name及proxy_ssl_session_reuse off等TLS校验指令。

在 HTTPS 环境下通过 Nginx 设置缓存控制,需区分两类场景:一是**控制浏览器如何缓存响应内容**(即设置 Cache-Control、Expires 等响应头),二是**Nginx 自身对上游 HTTPS 后端的代理缓存**(即 proxy_cache)。两者目标不同、配置独立,但常被混淆。关键点在于:HTTPS 本身不阻碍缓存,但涉及证书校验、SNI、会话复用等细节时,稍有疏漏就会导致缓存失效或跳过安全验证。
一、给浏览器设缓存头(HTTPS 响应侧)
这是最常用、也最直接的缓存控制方式,适用于静态资源或 API 响应。Nginx 通过 add_header 或 expires 指令注入标准 HTTP 缓存头,HTTPS 连接对此完全透明。
-
静态资源长期缓存:如 JS/CSS/图片,推荐使用
public+immutable+ 长期max-age
expires 1y;
add_header Cache-Control "public, immutable, max-age=31536000";
}
-
HTML 页面禁止强缓存:避免用户看到陈旧页面,设为
no-cache或短时效max-age
add_header Cache-Control "no-cache, max-age=0";
}
-
敏感接口禁用缓存:如支付、登录页,用
no-store彻底阻止任何本地暂存
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
二、缓存上游 HTTPS 后端(反向代理侧)
当 Nginx 作为反向代理,后端是 https://api.example.com 时,启用 proxy_cache 必须显式开启并严格配置 TLS 安全校验,否则可能跳过证书验证或复用错误 session。
-
必须同时启用四项 SSL 校验指令(缺一不可):
–proxy_ssl_verify on;(打开证书链校验)
–proxy_ssl_trusted_certificate /path/to/upstream-ca.crt;(指定可信 CA 证书链,PEM 格式,不含私钥)
–proxy_ssl_name "api.example.com";(显式声明期望的证书 SAN,尤其当proxy_pass写的是 IP 或变量时)
–proxy_ssl_server_name on;(强制发送 SNI,否则多数云服务拒绝连接) -
禁用 TLS 会话复用:
proxy_ssl_session_reuse off;——防止缓存复用已建立的 TLS 连接而绕过后续证书校验 -
合理定义缓存路径与键值:
proxy_cache_path /var/cache/nginx/https levels=1:2 keys_zone=https_cache:50m max_size=5g inactive=1h;proxy_cache https_cache;proxy_cache_key "$scheme$host$request_uri";(若后端依赖 Cookie 或 Header,可加入$cookie_user_id等)
三、避免常见陷阱
HTTPS 下缓存容易出问题,不是因为协议限制,而是配置松懈导致的安全妥协或逻辑错位:
-
别忽略
proxy_ignore_headers:如果上游 HTTPS 接口返回了Cache-Control: no-cache或Set-Cookie,默认会阻止 Nginx 缓存该响应;需明确覆盖:proxy_ignore_headers Cache-Control Set-Cookie; -
不要混用
expires和add_header Cache-Control处理同一资源:后者优先级更高,但若逻辑冲突(如一个设max-age=3600,另一个设no-cache),行为不可控;建议统一用add_header Cache-Control管理 -
调试务必看状态头:加一句
add_header X-Cache-Status $upstream_cache_status;,响应中就能看到HIT/MISS/EXPIRED,快速定位是否真走缓存
四、验证是否生效
实际部署后,用 curl 或浏览器开发者工具检查响应头:
- 浏览器请求静态资源 → 查看
Response Headers中是否有Cache-Control和Expires,且值符合预期 - 访问被代理的 HTTPS 接口 → 确认
X-Cache-Status存在且为HIT,同时SSL certificate verify ok日志出现在 Nginx error log 中(说明证书校验未被跳过)


















