Linux Nginx 中为图片和字体设置“一年以上”缓存实为 expires max(等价10年),即 Expires 设为2037年12月31日且 Cache-Control: max-age=315360000;必须配合资源指纹化(如哈希文件名)与 immutable 响应头,并精准 location 匹配扩展名,禁用于无哈希的动态资源。

Linux Nginx 中为图片和字体文件设置“一年以上”的超长缓存,实际是指采用协议允许的最长安全时限——即 expires max(等价于 10 年),而非真正无限期。它通过设置 Expires 头为 2037 年 12 月 31 日,并自动添加 Cache-Control: max-age=315360000 实现。但必须配合资源版本化(如文件名哈希)与 immutable 标识,否则缓存更新会失效。
只对稳定静态资源启用 expires max
该策略仅适用于内容极少变更、且部署时已做指纹化处理的资源,例如:
- 带哈希后缀的图片:
banner.a1b2c3.png、icon.f4e5d6.svg - 带哈希或版本前缀的字体:
font.8899aa.woff2、/static/v2026/fonts/inter-bold.woff2 - 不推荐用于 CMS 上传目录(如
/uploads/)或无哈希的通用图片(如logo.png)
精准 location 匹配 + immutable 响应头
在 Nginx 配置中,避免用宽泛路径(如 location /),而是按扩展名或路径前缀单独定义块。示例配置如下:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
location ~* \.(png|jpg|jpeg|gif|webp|ico|svg|woff2|ttf|eot|otf)$ {
expires max;
add_header Cache-Control "public, immutable" always;
access_log off;
log_not_found off;
}注意:always 参数确保 304 响应也携带缓存头;immutable 告诉浏览器该资源内容不会变更,跳过刷新时的条件请求(If-None-Match),大幅提升复用效率。
必须配套资源指纹机制
若图片 URL 始终是 /images/photo.jpg,即使加了 expires max,替换文件后用户仍看到旧图。可靠做法是:
- 构建工具(Webpack/Vite/VuePress/Hugo)自动生成含内容哈希的文件名
- HTML 或 CSS 中引用路径同步更新,例如
<img src="/images/photo.a1b2c3.jpg"> - 避免依赖查询参数(如
?v=202609),因 CDN 和代理可能忽略
验证缓存是否生效
部署后,在浏览器开发者工具 Network 面板中检查任意匹配的图片或字体请求:
- 响应头中存在
Expires: Thu, 31 Dec 2037 23:55:55 GMT - 响应头中存在
Cache-Control: public, immutable, max-age=315360000 - 第二次访问时状态码显示
200 (from memory cache)或200 (from disk cache),而非304

















