nginx静态资源缓存策略需分层配置:指纹化资源设1年不可变缓存(public, max-age=31536000, immutable),通用静态资源设7天缓存(public, max-age=604800),html等动态入口禁用强缓存并保留etag验证,同时注意location匹配优先级避免策略失效。

Nginx 为静态资源设置请求缓存策略,核心是让浏览器和中间代理(如 CDN)能安全、高效地复用资源,同时确保更新时用户立即看到新内容。这不是简单加个 expires 就行,而需按资源特性分层控制。
一、指纹化静态资源:用 URL 变更驱动长期缓存
这类资源(如 app.a1b2c3.js、style.f456.css)构建时已带哈希,内容不变则 URL 不变,内容一变 URL 就变。
- 在
location中精准匹配哈希特征:location ~* "\.[a-f0-9]{8,}\.(js|css|png|jpg|svg|woff2)$" { add_header Cache-Control "public, max-age=31536000, immutable" always; expires 1y; } -
immutable是关键:告诉浏览器“此资源永不变更”,可跳过If-None-Match验证,提升加载速度。 -
always参数确保即使返回 304 或错误响应,该头也生效。
二、通用静态资源:设中期缓存,不标 immutable
包括未加哈希的图标、字体、第三方库、常规图片等,内容可能被覆盖但 URL 不变。
- 统一匹配常见后缀:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2|ttf|eot)$ { add_header Cache-Control "public, max-age=604800"; expires 7d; } - 不加
immutable:避免旧文件覆盖后,浏览器仍长期使用失效缓存。
三、HTML 和动态入口:禁用强缓存,保留协商验证
HTML 是页面入口,常随版本更新;模板类资源也不适合长期缓存。
- 显式禁用强缓存,但允许条件请求:
location ~* \.(html|htm)$ { add_header Cache-Control "private, no-cache, must-revalidate, max-age=0"; add_header Last-Modified $date_gmt; add_header ETag ""; if_modified_since before; } - 浏览器每次发请求会带
If-Modified-Since或If-None-Match,Nginx 可返回304 Not Modified,节省带宽又保证实时性。
四、注意 location 匹配优先级,避免策略被覆盖
Nginx 的 location 匹配有严格优先级:= > ^~ > ~*。
- 若存在
location ^~ /static/这类前缀匹配,它会终止后续正则匹配,导致缓存头不生效。 - 解决方法:把缓存配置直接写进高优先级
location块内,或改用map指令在http块中动态生成缓存时间变量,再统一引用。
不复杂但容易忽略。











