nginx 禁止缓存特定文件需在匹配的 location 块中设置 cache-control、pragma 和 expires 响应头,如 location ~* .(js|css|png|jpg|gif)$ { add_header cache-control "no-store, must-revalidate"; add_header pragma "no-cache"; add_header expires "0"; },确保精准匹配与生效位置正确。

在 Nginx 中,禁止缓存特定文件,本质是通过 location 块匹配目标路径或扩展名,再用响应头指令主动告诉浏览器“别存、别用缓存”。这不是清除已有缓存,而是让后续请求每次都走服务器——关键在于精准匹配 + 正确响应头。
匹配特定扩展名并禁用缓存
最常用场景:对 JS、CSS、图片等静态资源强制不缓存(开发调试或敏感内容)。
- 用
location ~* \.(js|css|png|jpg|gif)$进行大小写不敏感正则匹配 - 加上三类标准缓存控制头,覆盖主流浏览器行为:
add_header Cache-Control "no-store, must-revalidate";add_header Pragma "no-cache";add_header Expires "0"; - 注意:这些头只对匹配到的请求生效,不影响其他 location;
no-store比no-cache更严格,直接禁止存储(包括磁盘和内存)
针对 HTML 页面单独处理
前端单页应用(SPA)常需确保每次加载最新 HTML,但又不想影响静态资源缓存。
- 推荐用
if判断请求文件后缀,避免正则覆盖过广:if ($request_filename ~* \.(htm|html)$) {
add_header Cache-Control "no-cache, no-store, must-revalidate";} - 该写法放在
location /内即可,比全局 location 更灵活;但注意if在 location 中可用,不能出现在 server 根层级 - 若使用
try_files或 rewrite,需确认$request_filename能正确解析为最终物理路径
避免常见失效陷阱
配置写了却没生效?大概率是位置或优先级问题。
- 规则必须放在实际处理该请求的 location 内部(比如 HTML 禁缓存要写在
location /里,而不是 server 块顶层) - 不要把禁缓存指令写在被
proxy_pass或fastcgi_pass覆盖的 location 里——反向代理时,响应头由后端决定,Nginx 的add_header默认不生效(需加always参数) - 浏览器已缓存旧版本?改完配置后需硬刷新(Ctrl+F5)或清空缓存,新响应头才会被接收和应用
动态接口也需禁缓存
API 接口返回 JSON 数据,尤其带时效性(如登录态、实时数据),同样不能缓存。
- 可匹配路径前缀,例如:
location ^~ /api/ {
add_header Cache-Control "no-store";
proxy_pass http://backend;} - 用
^~前缀匹配,优先级高于正则,确保不会被location ~ \.php$等规则意外覆盖 - 如果后端是 PHP 或 Node.js,建议同时在应用层设置响应头,形成双重保障











