nginx静态资源缓存通过响应头控制浏览器行为,需按类型差异化配置:图片等设365天、css/js设180天、字体设365天、html等设5分钟;哈希文件可用expires max配合immutable;须确保location匹配正确、响应头生效且html引用同步更新。

在 Nginx 中设置静态资源的缓存有效期,核心是通过响应头控制浏览器行为,不是让 Nginx 自己“存”文件内容,而是告诉客户端“这个文件能缓存多久”。关键在于按资源类型差异化配置,并配合构建策略才能真正生效。
按文件类型分组设置 expires 和 Cache-Control
推荐用正则匹配后缀,在 location 块中分别定义,避免全局一刀切:
-
图片、图标、WebP 等:缓存 1 年,加 immutable 标识
location ~* \.(jpg|jpeg|png|gif|bmp|ico|webp)$ {<br> expires 365d;<br> add_header Cache-Control "public, immutable";<br>} -
CSS、JS 文件:缓存 180 天(6 个月),同样启用 immutable
location ~* \.(css|js)$ {<br> expires 180d;<br> add_header Cache-Control "public, immutable";<br>} -
字体文件(woff2/woff/ttf/eot):也设为 365 天
location ~* \.(woff2|woff|ttf|eot|svg)$ {<br> expires 365d;<br> add_header Cache-Control "public, immutable";<br>} -
HTML、PHP、JSON 等动态或骨架类资源:必须短缓存甚至禁用强缓存
location ~* \.(html|htm|php|xml|json)$ {<br> expires 5m;<br> add_header Cache-Control "no-cache, must-revalidate, max-age=0";<br>}
用 expires max 实现长期强缓存(需前提条件)
对已做哈希命名的资源(如 app.a1b2c3.js),可直接使用 expires max:
- 它等价于设置 max-age=315360000(10 年)和 Expires 到 2037 年底
- 必须搭配
Cache-Control: public, immutable才能跳过后续验证请求 - ⚠️ 若文件名不变而内容更新(如未用 hash),用户将永远看不到新版本
确保配置真正生效的细节
很多缓存配置看似写了却没起作用,常见原因有:
- location 匹配不到:root 或 alias 路径不正确导致返回 404,缓存头根本不会发出
-
规则被覆盖:嵌套 location 或更宽泛的匹配(如
location /)写在后面,会覆盖前面的精确匹配 -
没验证响应头:用
curl -I https://yoursite.com/style.css检查是否返回了Cache-Control和Expires - HTML 引用路径未同步更新:即使 JS 缓存设为 1 年,若 HTML 还引用旧文件名,新缓存也无意义
辅助优化:open_file_cache 提升 Nginx 自身效率
这不是给浏览器设的缓存,而是让 Nginx 更快地读取本地静态文件:
- 在 http 块中配置:
open_file_cache max=10000 inactive=60s; - 搭配
open_file_cache_valid 30s;定期检查文件是否存在或变更 - 加上
open_file_cache_min_uses 2;和open_file_cache_errors on;避免无效路径拖慢服务











