最常用有效方式是在location块中用正则匹配图片后缀并设expires 1y,同时add_header Cache-Control "public, immutable";需确保文件名含内容哈希以保障更新生效。

直接在 location 块中匹配图片后缀,用 expires 指令设长期缓存,再配合 Cache-Control 头强化语义,是最常用也最有效的方式。
匹配常见图片类型并设置缓存时间
在 server 或 http 块中添加如下配置:
- 用正则表达式匹配
.jpg、.png、.gif、.webp、.svg等主流图片格式,注意加~*实现不区分大小写的匹配 -
expires 1y;会同时设置Expires响应头(绝对时间)和Cache-Control: max-age=31536000(相对秒数),浏览器优先认后者 - 建议加上
add_header Cache-Control "public, immutable";,immutable表示资源内容不会变更,允许浏览器跳过后续验证请求
示例配置:
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
确保文件名带版本或哈希(强缓存前提)
immutable 和一年缓存只对「文件名随内容变化」的资源安全。如果图片内容更新但文件名不变(比如 logo.png 覆盖上传),用户将长期看不到新图。
- 构建时生成带内容哈希的文件名,如
icon.a1b2c3.png,HTML 中引用新路径 - 或手动加版本参数(仅作降级方案):
banner.png?v=20261008,但需注意部分 CDN 或代理可能忽略查询参数 - 避免对未版本化的图片配
immutable,否则更新后无法生效
补充性能优化项(可选但推荐)
静态图片服务本身还可叠加几项轻量优化,提升响应效率:
- 启用
sendfile on;:让内核直接传输文件,绕过用户态拷贝 - 开启
tcp_nopush on;:配合sendfile,把多个响应头/数据包合并发送 - 配置
open_file_cache:缓存文件元信息(存在性、权限、修改时间),减少stat()系统调用
例如:
open_file_cache max=1000 inactive=30s;open_file_cache_valid 60s;
open_file_cache_errors on;
验证是否生效
重启 Nginx 后,用 curl -I 或浏览器开发者工具 Network 面板检查响应头:
- 看到
Cache-Control: public, immutable, max-age=31536000 - 同时有
Expires字段,时间戳为当前时间 +1 年 - 后续刷新请求若命中缓存,状态码仍为
200,且无X-Cache-Status(因未启用proxy_cache)


















