HTTPS站点下清理Nginx静态缓存需分清代理缓存(proxy_cache)与浏览器/CDN缓存:前者用ngx_cache_purge模块通过HTTPS PURGE精准清除,并确保缓存键含$scheme;后者靠文件名哈希与Cache-Control头实现自然失效,禁用暴力删盘。

HTTPS 站点下清理 Nginx 静态缓存,不能只删文件或 reload 就完事——必须兼顾缓存一致性、安全隔离和 TLS 上下文。核心是分清“谁在缓存”:是 Nginx 自身代理缓存(proxy_cache),还是浏览器/CDN 的终端缓存?真正需要你主动干预的,通常是前者。
一、确认静态资源走的是 proxy_cache 而非纯文件服务
如果静态资源由 Nginx 直接通过 root 或 alias 提供(比如 location /static { root /var/www; }),它本身不生成磁盘缓存;此时所谓“缓存”实际在浏览器或 CDN 层。你该做的是:
- 构建时给文件名加 contenthash(如
app.f3a7b2.js),让 URL 变更触发自然失效 - 响应头配
Cache-Control: public, immutable和长有效期(如expires 1y) - 确保 HTTPS 域名、协议一致,避免混合内容或 HSTS 导致缓存错乱
二、若走反向代理缓存(如静态资源经后端吐出)
这是真正需要 Nginx 层清理的场景。重点有三:
-
缓存键要包含 HTTPS 上下文:用
$scheme$host$request_uri,不能漏掉$scheme(否则 http/https 缓存混用) -
敏感参数要过滤:如
_t=1623456789这类时间戳参数,用map清洗$args,避免同一资源生成大量 key -
清理方式选 PURGE 而非暴力删盘:启用
ngx_cache_purge模块,在 server 块中加 location:
location ~ ^/purge(/.*)$ {<br> allow 127.0.0.1;<br> deny all;<br> proxy_cache_purge static_cache $scheme$host$is_args$args;<br>}然后执行:curl -X PURGE https://your.site/purge/css/app.css(注意用 HTTPS 协议发起)
三、自动清理靠 inactive,不是靠 expires
proxy_cache_valid 只控制“是否返回缓存”,不决定物理删除。真正触发磁盘清理的是 inactive 参数:
- 例如
inactive=1h表示:该缓存项最后一次被访问后,1 小时内再没被命中,就会被 manager 进程自动删掉 - 这个机制是异步、安全、无需重启的,比手动脚本更可靠
- 别用
rm -rf /var/cache/nginx/*——会破坏 keys_zone 映射,导致后续缓存异常
四、浏览器层也要同步更新
Nginx 清了,用户不一定立刻看到新文件。需配合前端策略:
- HTML 文件设短缓存(如
expires 1m)+ETag或Last-Modified支持协商缓存 - JS/CSS 文件名带哈希,HTML 中引用新路径,旧缓存自然失效
- 避免在 HTTPS 页面里引用 HTTP 资源,防止浏览器拒绝加载或降级缓存


















