Nginx可通过expires指令为图片和字体设置一年缓存,使用后缀匹配location块并添加Cache-Control: public, immutable;需置于server内且优先级高于动态规则,确保静态文件由Nginx直接提供,并配合哈希文件名避免缓存 stale 问题。

在 Nginx 中,可以通过 expires 指令为静态资源(如图片、字体)设置一年的浏览器缓存时间,从而减少重复请求、提升页面加载速度。
匹配图片和字体文件类型
使用 location 块配合正则表达式或后缀匹配,精准定位需要缓存的资源。推荐用后缀匹配方式,简洁且兼容性好:
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
<p>location ~* .(woff|woff2|ttf|eot|otf|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}-
~*表示忽略大小写的正则匹配 -
1y即一年(365 天),Nginx 内部会换算为秒并写入Expires响应头 -
Cache-Control: public, immutable告诉浏览器该资源不会改变,可长期缓存(注意:immutable需客户端支持,现代浏览器基本都支持)
放在合适的配置层级
确保这些 location 块位于 server 块内,且优先级高于通用的 location / 或 PHP 处理块。Nginx 按照匹配顺序选择最具体的 location,所以图片/字体规则要写在动态内容规则之前。
如果使用了 try_files 或反向代理,需确认静态文件确实由 Nginx 直接提供(而非被转发到后端),否则 expires 不生效。
验证缓存是否生效
部署后,用浏览器开发者工具(Network 标签页)查看响应头:
- 检查是否有
Expires头,值为当前时间加一年 - 检查
Cache-Control是否包含max-age=31536000(即 365×24×3600 秒) - 刷新页面时,对应资源状态码应为
304 Not Modified或直接从内存/磁盘缓存加载(显示from memory cache或from disk cache)
注意事项
启用长期缓存的前提是:资源 URL 随内容变化而变化(例如添加哈希指纹,如 logo.a1b2c3.png)。否则用户可能因缓存未过期而看不到更新后的图片或字体。
若资源路径无法带哈希,可考虑缩短缓存时间(如 expires 7d),或配合版本参数(?v=2.0)并开启 ignore_parameters,但更推荐构建时生成带哈希的文件名。


















