nginx 通过 expires 指令为静态资源设置缓存过期时间,自动添加 expires 和 cache-control 响应头;支持按文件类型差异化配置,如 js/css 设 1 年、图片设 7 天、html 设立即过期;默认启用 if_modified_since 协商缓存,配合文件修改时间返回 304;需用 curl 或浏览器开发者工具验证响应头并重载配置。

可以通过 Nginx 的 expires 指令配合时间表达式,为静态资源(如 CSS、JS、图片)设置 HTTP 缓存过期时间窗口,从而控制浏览器在多长时间内直接使用本地缓存,无需向服务器发起请求。
设置固定缓存时长
最常用的方式是为某类静态文件统一设置一个相对过期时间。Nginx 会在响应头中添加 Expires 和 Cache-Control: max-age=xxx,两者语义一致,现代浏览器优先遵循 Cache-Control。
示例配置:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1h;
}该配置表示所有匹配的文件响应头中将包含 Cache-Control: max-age=3600 和对应的 Expires 时间戳(服务端当前时间 + 1 小时)。
- 支持的时间单位:`s`(秒)、`m`(分)、`h`(小时)、`d`(天)、`M`(月 ≈ 30 天)、`y`(年 ≈ 365 天)
- 注意:`expires off;` 可显式禁用缓存头;`expires -1;` 表示“立即过期”,等效于 `Cache-Control: no-cache`(仍可协商缓存)
按文件类型设置差异化过期策略
不同资源更新频率不同,应区别对待。例如,带哈希指纹的 JS/CSS 文件可长期缓存,而 HTML 通常不缓存或缓存极短时间。
location ~* \.(js|css)$ {
expires 1y;
}
location ~* \.(png|jpg|jpeg|gif|webp|ico|svg)$ {
expires 7d;
}
location ~* \.(html|htm)$ {
expires -1;
}这种分层策略能兼顾性能与内容及时性。关键前提是:带版本号或哈希值的静态资源路径每次变更都会变化(如 app.a1b2c3.js),因此可放心设为长期缓存。
结合 if_modified_since 实现条件请求(增强时效性)
仅靠 expires 是被动缓存,若希望资源实际未修改时返回 304 Not Modified,需确保 Nginx 启用基于文件修改时间的协商缓存:
- 默认已启用
if_modified_since exact;(精确比对Last-Modified) - 无需额外配置,只要文件有真实修改时间且客户端发送了
If-Modified-Since请求头,Nginx 就会自动处理 304 响应 - 注意:此机制依赖文件系统时间戳,不适合只读挂载或容器中动态生成的文件
验证与调试技巧
部署后务必检查响应头是否生效:
- 用
curl -I https://example.com/style.css查看Cache-Control和Expires - 在浏览器开发者工具 Network 标签中刷新资源,观察状态码(200 from disk cache / 304 / 200)和 Header 字段
- 修改
expires后记得重载 Nginx:nginx -t && nginx -s reload
不复杂但容易忽略:时间窗口生效的前提是客户端未主动禁用缓存(如开发者工具勾选 “Disable cache”),且资源 URL 没有变动导致缓存失效。











