直接用add_header设置禁止强缓存的响应头需三者齐上:Cache-Control、Pragma、Expires,并配合proxy_hide_header或fastcgi_hide_header屏蔽后端缓存头,且应在location块中按路径精准配置。

直接用 add_header 设置禁止强缓存的响应头,就能让浏览器跳过本地缓存、每次重新请求资源。关键不是“破坏”,而是明确告诉浏览器:别存、别用、必须重验。
设置强制不缓存的三要素
浏览器强缓存依赖 Cache-Control、Expires 和 Pragma 三个头部协同生效。只设一个可能被忽略或覆盖,建议三者齐上:
-
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";——no-store最彻底,禁止任何缓存;no-cache要求每次验证;must-revalidate确保过期后不擅自使用;max-age=0表明立即过期 -
add_header Pragma "no-cache";—— 兼容 HTTP/1.0 客户端(如老旧代理) -
add_header Expires "0";或add_header Expires "Wed, 01 Jan 1970 00:00:01 GMT";—— 将过期时间设为过去时刻
确保配置真正生效的关键点
add_header 在 location 块里写才有效,且不会继承上级作用域。更重要的是:如果后端(比如 PHP、Node.js)自己返回了 Cache-Control: public, max-age=3600,Nginx 默认只是追加你的头,而浏览器通常取第一个——结果还是走强缓存。
- 用
proxy_hide_header(反向代理场景)或fastcgi_hide_header(FastCGI 场景)先屏蔽后端发来的缓存头 - 加上
always参数,保证即使返回 4xx/5xx 状态码也生效:add_header Cache-Control "no-store" always; - 或者改用
expires -1;,它会自动设置Expires和Cache-Control: no-cache,并隐式覆盖后端同名头
按路径精准控制,避免误伤
不要在 server 块全局禁用,否则静态资源(JS/CSS/图片)也会失去缓存优势。应针对具体需要实时性的路径配置:
- 登录页、管理后台首页:
location = /admin/ { ... } - API 接口:
location /api/ { ... } - HTML 页面(非 SPA 首屏):
location ~ \.html$ { ... }
对静态资源则用 expires 1y; 或 add_header Cache-Control "public, immutable"; 反而更合理。
验证是否生效
打开浏览器开发者工具 → Network → 找到对应请求 → 查看 Response Headers:
- 确认存在你设置的
Cache-Control、Pragma、Expires - 检查没有重复的
Cache-Control(两个头说明没隐藏成功) - 200(不是
200 from disk cache或304)


















