nginx 中 expires max 表示 1 年强缓存,等价于 expires 1y,设置 cache-control: max-age=31536000 和 expires 头,仅适用于不变的静态资源,并需配合文件哈希和 immutable 头实现可靠长期缓存。

在 Nginx 中配置 expires max 并不能真正实现“永久”缓存,但它是实现长期强缓存(通常为 1 年)的常用且有效方式。浏览器会依据响应头中的 Cache-Control: max-age=31536000 和 Expires 字段决定是否复用本地缓存,前提是资源路径不变、且未被手动清除或因其他策略(如隐私模式、禁用缓存)绕过。
明确 expires max 的实际含义
expires max 是 Nginx 的快捷写法,等价于:expires 1y; 或 expires 31536000s;
它会同时设置两个 HTTP 响应头:
-
Cache-Control: max-age=31536000(推荐优先级更高) -
Expires:(兼容较老客户端)
注意:这不是“永久”,而是“一年”。HTTP 协议本身不支持真正无限期缓存;超过一年的值(如 max-age=315360000)可能被部分浏览器截断或忽略,1 年是业界广泛接受的安全上限。
只对静态资产路径启用 expires max
切勿全局配置,应精准作用于已知不变的静态资源(如 JS/CSS/图片/字体),常见做法是按文件后缀或特定 location 匹配:
- 按扩展名匹配(推荐):
expires max;
add_header Cache-Control "public, immutable";
}
- 按版本化路径匹配(更可靠):
expires max;
add_header Cache-Control "public, immutable";
}
其中 immutable 是关键补充——告诉浏览器该资源内容不会变更,即使用户刷新也不会重新验证(避免 If-None-Match/If-Modified-Since 请求)。
配合资源指纹实现真正可复用的长期缓存
仅靠 expires max 不足以保证“永久复用”,因为若文件内容更新而 URL 不变,浏览器会继续使用旧缓存。必须让每个版本资源拥有唯一 URL:
- 构建时生成带哈希的文件名,例如
main.a1b2c3d4.js - HTML 中引用该带哈希的路径(通过构建工具自动注入)
- Nginx 对这类路径无条件启用
expires max
这样,内容变更 → 文件名变更 → URL 变更 → 浏览器视为全新资源,旧缓存自然失效,新资源再次被长期缓存。
避免常见陷阱
-
不要对 HTML 启用 expires max:HTML 通常是动态或需频繁更新的,应设为
no-cache或短时效 -
确保服务器时间准确:Nginx 依赖系统时间生成
Expires头,偏差大会导致缓存异常 -
CDN 或反向代理需透传缓存头:如果前面有 CDN(如 Cloudflare),需确认其未覆盖或删除
Cache-Control - 开发环境慎用:可通过 map 或 if 判断 $host 或 $args 临时关闭,避免调试困难











