直接在 location 块里用 expires 指令就能控制浏览器缓存,关键是精准匹配资源路径或后缀、按类型差异化设置过期时间(如带哈希静态资源设 1y,html/动态内容设 epoch),并必须配合 add_header 补全 cache-control 头以确保现代浏览器正确解析。

直接在 location 块里用 expires 指令就能控制浏览器对不同资源的缓存行为,关键是匹配要准、策略要分类型、响应头要补全。
精准匹配静态资源路径或后缀
避免误缓存 HTML 或接口数据,不能笼统写 location / 或 location ~ \.html$。推荐两种安全方式:
- 用
~*不区分大小写正则匹配常见后缀:location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|webp)$ { ... } - 用
^~前缀高效匹配静态目录(如 CDN 或构建输出目录):location ^~ /static/ { ... }或location ^~ /assets/ { ... }
按资源是否带版本哈希设不同过期时间
文件名是否含哈希(如 app.a1b2c3.js)决定了能否放心设长缓存:
- 带哈希的 JS/CSS/字体/SVG:设
expires 1y;或expires max;,再加immutable - 未做版本控制的通用资源(如
logo.png、common.css):建议expires 1h;~expires 1d;,降低更新延迟风险 - 用户上传类图片(如头像)、动态生成图:应禁用强缓存,设
expires -1;或expires epoch;
为 HTML 和动态内容禁用强缓存
HTML 页面、PHP 脚本、JSON 接口等必须每次校验最新状态,不能靠 Expires 头长期缓存:
- 统一用
expires epoch;(立即过期)或expires -1; - 配合
add_header Cache-Control "no-cache, must-revalidate, max-age=0"; - 若需单独控制首页,可用
location = / { ... }确保根路径不被缓存
务必补全 Cache-Control 响应头
expires 只设置 Expires 头,现代浏览器更依赖 Cache-Control。两者要配合使用,且声明需合并、不重复:
- 带哈希的静态资源:
add_header Cache-Control "public, immutable, max-age=31536000"; - 普通图片/字体:
add_header Cache-Control "public, max-age=2592000";(对应 30d) - 动态内容:
add_header Cache-Control "no-cache, must-revalidate, max-age=0"; - 注意:不要在同一个 location 中多次
add_header同一字段,否则会覆盖或报错











