精准控制HTML缓存需在匹配.html文件和根路径的location块中,用add_header Cache-Control "no-cache, must-revalidate" always;配合Pragma和Expires过期头,并实测响应头验证生效。
直接用
并不能“自动生效”,关键在于它加在哪个
块里、是否被上游头覆盖、以及是否匹配了真正需要控制的资源类型。精准控制的核心是:**谁该禁用强缓存、在哪加、怎么确保它起作用**。
只对 HTML 文件启用 no-cache, must-revalidate
HTML 是前端资源的入口,一旦被缓存,新版本 JS/CSS 的路径就无法加载,用户可能看到白屏或旧功能。必须明确限定作用范围:
匹配所有
文件:
覆盖根路径(如访问
自动返回
):
避免写成
—— 它仍可能触发条件请求(If-None-Match),而
强制每次验证,更可靠
防止被后端或默认配置覆盖
Nginx 默认不覆盖已有响应头;如果上游(如 PHP-FPM、反向代理)已设置了
,你的
会被忽略:
用
参数强制添加(Nginx ≥ 1.7.5):
或者先隐藏上游头,再添加自己的:
检查配置加载顺序:
的文件若在你配置之后加载,可能覆盖你的规则
配合其他头增强兼容性与语义明确性
单靠
在老旧客户端或某些中间代理中可能不够稳妥:
补充
(HTTP/1.0 兼容):
设置
为过去时间,双重保险:
或
注意不要混用
:它会禁止一切缓存,和
的“允许缓存但强制验证”逻辑冲突
上线后快速验证是否生效
别只信配置,要实测响应头:
打开浏览器 DevTools → Network → 刷新页面 → 找到
请求
查看 Response Headers 中:
✅
✅
✅
是一个过去时间
手动改一行 HTML 内容并重新部署,清空浏览器缓存再访问 —— 若仍是旧版,说明缓存规则未命中,大概率是
优先级低或被其他配置覆盖
add_header Cache-Control "no-cache, must-revalidate"location.htmllocation ~* \.html$ {
add_header Cache-Control "no-cache, must-revalidate";
}/index.htmllocation = / {
try_files /index.html =404;
add_header Cache-Control "no-cache, must-revalidate";
}max-age=0no-cacheCache-Controladd_headeralwaysadd_header Cache-Control "no-cache, must-revalidate" always;proxy_hide_header Cache-Control;
add_header Cache-Control "no-cache, must-revalidate";includeCache-ControlPragma: no-cacheadd_header Pragma "no-cache" always;Expiresexpires epoch;add_header Expires "Fri, 01 Jan 1990 00:00:00 GMT" always;no-storemust-revalidateindex.htmlCache-Control: no-cache, must-revalidatePragma: no-cacheExpireslocation