清理和禁用浏览器本地缓存本质是通过Nginx配置响应头(如Cache-Control、ETag等)控制浏览器行为,而非操作服务器文件;针对HTML页面常用no-cache+协商缓存,敏感页面则用no-store彻底禁用缓存,并需验证响应头与状态码。

清理和禁用浏览器本地缓存,本质是控制 Nginx 发送给浏览器的响应头,让浏览器不存、少存或每次确认再用。这不是操作 Nginx 服务器上的文件,而是通过 HTTP 协议“告诉”浏览器怎么做。
针对 HTML 等动态页面:禁用强缓存 + 启用协商缓存
这是最常用也最平衡的做法:既避免用户看到旧页面,又节省带宽(未变时返回 304)。
- 在对应 location 块中(如匹配 .html 或根路径),添加:
add_header Cache-Control "no-cache";
这表示浏览器不能直接复用本地副本,必须向服务器验证。 - 开启校验机制:
etag on;
if_modified_since exact;
这样浏览器会带上 If-None-Match 或 If-Modified-Since 请求头,Nginx 可比对后决定返回 200 还是 304。 - 务必确保不同时设置 expires 或 max-age,否则会覆盖 no-cache 效果。
针对登录页、订单页等敏感页面:彻底禁用所有缓存
要求每次请求都走完整流程,不许任何中间环节(包括浏览器、代理、CDN)保存副本。
- 在特定 location 中添加严格头:
add_header Cache-Control "no-store, must-revalidate, proxy-revalidate";
add_header Pragma "no-cache";
add_header Expires "0"; - no-store 是关键——它禁止浏览器写入磁盘,也禁止代理缓存,比 no-cache 更彻底。
- 适用于 /login、/checkout、/api/auth 等路径,不建议全局使用。
验证是否生效
部署后,打开浏览器开发者工具 → Network 标签 → 刷新页面,点开一个 HTML 请求:
- Response Headers 中应出现 Cache-Control: no-cache 或 no-store;
- 应有 ETag 和 Last-Modified 字段;
- 刷新时状态码显示 304 Not Modified(内容未变)或 200(内容更新),而不是 200 from disk cache 或 from memory cache。
注意常见陷阱
很多缓存问题其实不是策略没设,而是被覆盖或遗漏了:
- Nginx 的 add_header 默认不继承父块,子 location 必须显式重写,或加 always 参数(Nginx 1.7.5+)确保头一定发出;
- 如果用了 try_files $uri $uri/ /index.html(如 Vue/React SPA),要确保 fallback 的 /index.html 所在 location 也应用了相同缓存头,否则它可能被意外长期缓存;
- 不要在同一个 location 里既写 expires 1h 又写 add_header Cache-Control no-cache——前者会生成 max-age,优先级更高,实际仍会缓存。


















