Nginx静态资源缓存需按类型差异化配置:哈希资源设一年强缓存+immutable;普通静态资源设30天可验证缓存;HTML入口禁强缓存、启协商验证;动态敏感接口彻底禁用缓存,并注意location优先级与响应头冲突问题。

Nginx 静态资源的缓存控制不是加个 expires 就完事,关键在于用 Cache-Control 响应头向浏览器和 CDN 明确传达“能不能缓、缓多久、要不要验证”。策略必须按资源类型区分,否则容易导致白屏、旧资源不更新或隐私泄露。
哈希静态资源:设一年强缓存 + immutable
这类文件名含内容哈希(如 app.a1b2c3.js、style.f456.css、logo-789.png),内容不变则 URL 不变,适合长期强缓存:
- 用正则精准匹配:
location ~* \.[a-f0-9]{8,}\.(js|css|png|jpg|webp|woff2|svg)$ - 设置响应头:
add_header Cache-Control "public, max-age=31536000, immutable" always; -
always确保覆盖 PHP 或代理返回的旧头;immutable告诉浏览器无需验证,直接复用
普通静态资源:设30天可验证缓存
未带哈希的图标、字体、第三方库(如 jquery.min.js、logo.png),更新不可控,需保留验证能力:
- 按后缀匹配:
location ~* \.(png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$ - 设置响应头:
add_header Cache-Control "public, max-age=2592000" always; - 不加
immutable,保留 ETag / Last-Modified 协商机制,内容更新后能自动失效
HTML 入口文件:禁强缓存,启协商验证index.html 是页面入口,每次部署都可能变化。靠时间过期不可靠,必须每次加载前校验:
- 匹配所有 HTML:
location ~* \.html?$ - 设置响应头:
add_header Cache-Control "private, no-cache, must-revalidate" always; - 同时确保 Nginx 开启
ETag on;(默认开启),后端返回 304 节省传输
动态与敏感接口:彻底禁用缓存
API、用户数据、表单页等不能留任何缓存痕迹:
- 路径匹配:
location ^~ /api/,location ^~ /user/,location ~* \.(php|json)$ - 设置响应头:
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always; -
no-store比no-cache更严格,禁止浏览器和 CDN 写入磁盘缓存
避免策略失效的关键细节
- location 优先级要理清:
^~前缀匹配会终止后续正则匹配,缓存头必须写在对应location块内,不能依赖外部正则块 - 不混用
expires和add_header Cache-Control:后者优先级更高、语义更准,推荐统一用add_header - 上线后务必验证:用
curl -I或 Chrome DevTools Network 面板检查响应头是否生效,确认没有冲突指令(如private和public并存)
不复杂但容易忽略。


















