浏览器未发请求是因强缓存生效,需分客户端、nginx、反向代理三层排查:先用devtools禁用缓存并硬刷新验证;再确认add_header是否在匹配location中生效且未被上游覆盖;最后检查cdn或中间代理是否隐性缓存。

核心问题不是 Nginx 没生效,而是浏览器或中间层“没发请求”——缓存策略让客户端跳过了向 Nginx 发起新请求的步骤。排查要分三层:客户端、Nginx 本身、反向代理链路。
检查浏览器是否真的发出了新请求
强缓存生效时,浏览器根本不会发请求(Network 面板里看不到该资源条目,或显示 from memory cache / from disk cache)。这不是 Nginx 的错,是浏览器按 Cache-Control 或 Expires 自行决定的。
- 打开 Chrome DevTools → Network 标签 → 勾选 “Disable cache”(仅当前调试有效)→ 刷新页面,看资源是否返回 200(而非 304 或直接离线加载)
- 查看响应头:确认实际返回的 Cache-Control 和 Expires 是否与你配置一致(比如是不是被 upstream 或其他 location 覆盖了)
- 右键刷新按钮 → “清空缓存并硬性重新加载”(Ctrl+Shift+R),强制绕过所有本地缓存再试一次
确认 Nginx 缓存控制指令是否真正生效
add_header 只对匹配到该 location 的响应生效,且不继承。常见失效原因:
- location 匹配不精确:比如写成
location ~ \.js$,但文件路径含查询参数(app.js?v=1)可能因正则未覆盖而漏掉 - 被更高优先级 location 覆盖:例如 root 写在 server 级,而 add_header 写在某个子 location,但请求其实命中了另一个更宽泛的 location
- add_header 被 proxy_pass 后端响应头覆盖:若走反向代理,后端返回了 Cache-Control,会覆盖 Nginx 的 add_header(除非加
always参数:add_header Cache-Control "no-cache" always;) - 配置未重载:改完 nginx.conf 后执行
nginx -s reload,别只改文件不 reload
排查反向代理或 CDN 层的隐性缓存
如果你的请求路径是:浏览器 → CDN → Nginx1(反代) → Nginx2(静态服务),那么问题可能出在中间任一层:
- 检查 CDN 控制台:是否对 .js/.css 设置了默认缓存时间?是否开启“忽略查询参数”导致
?v=xxx被无视? - 检查第一层 Nginx(反代层):是否存在
proxy_cache、proxy_cache_valid等指令?用curl -I直连该层 IP,看响应头是否有X-Cache: HIT类标识 - 检查 Nginx 日志:对比不同客户端 IP 的访问日志,确认请求是否真实到达最终静态服务节点
验证静态文件是否真被更新且可访问
有时你以为文件更新了,其实没成功同步:
- 用 curl 直接请求 Nginx 服务 IP + 端口(绕过 CDN 和代理):
curl -I http://your-server/static/app.js,看返回内容和时间戳是否最新 - 登录服务器,
ls -l查看对应静态文件的修改时间;stat /path/to/file看 inode 和 mtime 是否变化 - 确认 Nginx worker 进程能读取该文件:检查文件权限(如
nginx用户能否读取)、SELinux 或 AppArmor 是否拦截











