nginx通过expires和add_header cache-control指令设置静态资源缓存时效,按文件类型在location块中分别配置;html类需短缓存,js/css等可设180d,图片字体等365d,并推荐版本化文件名实现可靠缓存更新。

在 Nginx 中设置静态资源的缓存失效时间,核心是通过 HTTP 响应头控制浏览器或中间代理如何缓存文件。Nginx 本身不“存储”静态文件内容用于客户端缓存(那是浏览器做的事),而是通过 expires 或 add_header Cache-Control 指令,告诉客户端“这个资源可以缓存多久”。
以下是实际、可落地的操作要点:
针对不同文件类型设置缓存时长
用正则匹配文件后缀,在 location 块中分别配置,是最常用也最稳妥的方式:
location ~* \.(jpg|jpeg|png|gif|bmp|ico|webp)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
location ~* \.(css|js)$ {
expires 180d;
add_header Cache-Control "public, immutable";
}
location ~* \.(woff2|woff|ttf|eot|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
location ~* \.(html|htm|php|xml|json)$ {
expires 5m;
add_header Cache-Control "no-cache, must-revalidate, max-age=0";
}
说明:
-
expires 365d会同时设置Expires头和Cache-Control: max-age=31536000 -
immutable表示资源内容不会变,允许浏览器跳过条件请求(如If-None-Match),提升重复访问性能 - HTML 类资源必须短缓存甚至不缓存,避免用户看到旧版本页面
确保缓存策略生效的关键细节
-
位置要对:
expires必须写在能匹配到静态文件的location块里(不能只放在server或http层而没命中) -
root 或 alias 要明确:静态文件需能被 Nginx 正确定位,否则 404 导致
expires不生效 -
避免覆盖:如果多个
location块嵌套或重叠,后加载的规则可能覆盖前面的expires,建议用^~或精确匹配减少歧义 -
测试响应头:用
curl -I http://yoursite.com/style.css查看是否返回了Cache-Control和Expires字段
提升服务端效率的辅助缓存:open_file_cache
这不是给浏览器设的缓存,而是让 Nginx 自己更高效地打开/检查静态文件:
http {
open_file_cache max=10000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 3;
open_file_cache_errors on;
}
它缓存的是文件元信息(大小、修改时间、是否存在等),不是文件内容,适合高并发静态站点,但对缓存“失效时间”无直接影响。
特别提醒:版本化文件名才是长效解法
即使设置了 expires 365d,一旦你更新了 app.js,用户仍会继续用旧缓存。真正可靠的方案是:
- 构建时生成带哈希的文件名,如
app.a1b2c3.js - HTML 中引用该新文件名
- 这样每次变更都对应新 URL,浏览器自然视为新资源,无需等待缓存过期
Nginx 只负责把“带哈希的 URL”正确返回并标记长期缓存,内容更新与缓存失效就彻底解耦了。











