nginx在https下缓存明文响应,需按敏感度分级配置缓存键、有效期与安全头:动态接口须含用户标识,静态资源可长缓存,高敏操作禁用缓存,并通过purge或版本化主动清理。

HTTPS 下的 Nginx 缓存不是“把加密响应直接存起来”,而是缓存解密后的原始响应内容——Nginx 作为反向代理,在 TLS 终止后拿到明文 HTTP 响应,再按规则决定是否缓存、如何标识、何时失效。关键不在传输层加密,而在缓存层如何避免错乱与泄露。
缓存键必须反映 HTTPS 上下文与用户身份
默认的 $scheme$host$request_uri 在 HTTPS 站点中虽含 https,但若忽略请求头或 Cookie,就会让不同用户的私有响应互相覆盖。例如:
- 带登录态的接口(如
/api/order)必须在proxy_cache_key中加入$http_authorization或$cookie_sessionid,否则 A 用户的订单页可能被 B 用户命中; - 静态资源(如
/static/app.js)可不带用户字段,但需保留$scheme和$host,防止 HTTP/HTTPS 混用触发混合内容警告或 HSTS 冲突; - 剔除无意义参数(如
_t=123456),用map预处理$args,避免同一资源生成大量碎片缓存。
缓存策略要按敏感度分级控制
不能所有 HTTPS 响应都套一个 proxy_cache_valid 200 10m。应结合路径、状态码和业务语义区分对待:
- 公开静态资源(
.js、.css、/images/logo.png):设长周期,如proxy_cache_valid 200 365d,配合add_header Cache-Control "public, immutable"; - 带用户数据的动态接口(
/api/profile):建议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。
主动清理比被动过期更可靠
等缓存自然失效无法应对突发变更,比如价格调整、权限回收或配置发布。Nginx 自身不感知业务事件,需外部驱动清理:
- 启用
ngx_cache_purge模块,开放/purge/接口,仅允许内网调用,例如:
location /purge {
allow 127.0.0.1;
deny all;
proxy_cache_purge mycache $host$request_uri$is_args$args;
} - 对关键页面(如用户首页),采用缓存键版本化:在
proxy_cache_key中嵌入变量$cache_version,发布时更新该变量值,实现批量失效。
安全加固:防止缓存污染与敏感泄露
HTTPS 本身不保证缓存安全,错误配置会导致 token、手机号等被意外缓存或暴露:
- 对含敏感信息的响应(如含
Set-Cookie、Authorization头的 HTML 页面),强制加头:
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";no-store比no-cache更严格,能阻止浏览器和中间代理保存响应体; - 避免覆盖后端已设的
Cache-Control:优先用proxy_hide_header Cache-Control+ 条件性add_header,而非无差别add_header Cache-Control; - 定期审计响应头,确认
X-Cache-Status、Cache-Control、Set-Cookie等字段符合预期,尤其关注private与public的使用场景。











