nginx 中静态资源自动化缓存更新依赖 url 变更(构建哈希)、强缓存头(expires 1y + immutable)和配置热生效(nginx -s reload)三者协同,确保 html 禁用缓存、静态资源长期强缓存且内容不变。

静态资源的自动化缓存更新,在 Nginx 中并不是靠“监听文件变化”或“主动推送”实现的,而是通过URL 变更 + 缓存头协同 + 配置热生效三者配合达成的无感更新。核心目标是:用户无需手动刷新、清缓存,打开页面就看到最新资源。
用构建哈希确保 URL 天然变更
这是最根本、最可靠的自动化前提。浏览器只认 URL,不认文件内容。只要 URL 不变,哪怕服务端文件已更新,强缓存仍可能返回旧版本。
- 前端构建工具(如 Vite、Webpack)启用 contenthash,生成类似
app.f3a8b2c1.js、style.d9e4f5a7.css的文件名 - HTML 中自动注入新文件名(如
<script src="/js/app.f3a8b2c1.js"></script>),无需人工修改 - 部署时旧文件可保留(兼容历史链接),新请求命中新 URL,自然绕过所有旧缓存
配强缓存头,让新资源“一次加载,长期有效”
URL 变了之后,要让浏览器对新资源建立稳定、高效的缓存策略,避免重复请求。
- 对带哈希的静态资源(
.js、.css、.png等),在 location 块中设置:
expires 1y;
add_header Cache-Control "public, immutable";
}
-
expires 1y告诉浏览器缓存一年,大幅降低请求数 -
immutable是关键——承诺该 URL 对应内容永不变更,浏览器跳过协商缓存(如 ETag 校验),直接复用本地副本 - 务必关闭 ETag 和 Last-Modified(默认已关),避免协商逻辑干扰强缓存
HTML 必须禁用缓存,保证入口始终新鲜
HTML 是一切的起点。如果 index.html 被缓存,它引用的仍是旧哈希文件,整个更新就失效了。
- 精准匹配 HTML 入口文件:
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
- 或统一处理所有 HTML:
expires -1;
add_header Cache-Control "no-cache";
}
- 这样每次访问都会向服务器确认 HTML 是否更新,确保拿到最新哈希引用
配置变更后热重载,让缓存策略即时生效
修改了 expires 或 add_header 后,需立即应用,且不能中断服务。
- 先校验语法:
nginx -t,确认无拼写错误、时间单位合法(如1y、7d) - 检查配置文件权限:确保 nginx worker 进程用户(如
www-data)有读取权限 - 执行重载:
nginx -s reload,master 进程启动新 worker,旧 worker 平滑退出 - 验证效果:
curl -I https://your.site/static/app.f3a8b2c1.js,确认响应头含Cache-Control: public, immutable和Expires字段











