Nginx中expires max并非永久缓存,通常等价于1年有效期(max-age=31536000),需配合资源路径唯一性及immutable头使用;仅适用于带哈希指纹的静态资源,HTML和API等动态内容须禁用或设短时效。

在 Nginx 中配置浏览器端长效缓存,核心是用 expires 指令控制响应头中的 Expires 和 Cache-Control: max-age,但必须明确:它不是“永久”,而是设定一个足够长、被浏览器广泛接受的有效期(通常为 1 年或 10 年),并需配合资源路径唯一性才能真正复用。
expires max 的真实含义和取值
expires max 是 Nginx 的快捷写法,不同版本实现略有差异:
- 多数稳定版(如 Ubuntu 20.04 自带的 Nginx 1.18)将其等价于
expires 1y,即设置Cache-Control: max-age=31536000和Expires头为当前时间 + 1 年; - 部分新版或自定义编译版本可能设为 10 年(
max-age=315360000)或固定时间点(如Thu, 31 Dec 2037 23:55:55 GMT); - HTTP 协议不支持真正“无限”,超过 1 年的值可能被某些浏览器截断或忽略,1 年是兼容性与实效性的平衡选择。
只对不变的静态资源启用 expires max
切勿全局设置,应精准匹配已知内容稳定的资源类型:
- 推荐按文件后缀匹配(覆盖常见前端资产):
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot|webp)$ {
expires max;
add_header Cache-Control "public, immutable";
} - 更可靠的方式是按版本化路径匹配(如构建输出目录):
location ^~ /static/v202410/ {
expires max;
add_header Cache-Control "public, immutable";
} -
immutable是关键补充——告诉浏览器该资源不会更新,可跳过If-None-Match等验证请求,提升强缓存命中率(Chrome 49+、Firefox 49+ 支持)。
必须配合资源指纹,否则缓存会锁死旧版本
仅加 expires max 而不改 URL,会导致用户长期无法获取新 JS/CSS:
- 构建时生成带内容哈希的文件名,例如
main.a1b2c3d4.js、style.e5f6g7h8.css; - HTML 中引用路径由构建工具(Webpack/Vite/Rollup)自动注入,确保每次发布对应唯一 URL;
- Nginx 不需要为每个哈希单独配置,通配正则即可生效;
- 若仍用查询参数方式(如
app.js?v=1.2.3),部分 CDN 和代理可能忽略 query string,不推荐。
明确排除不该缓存的资源
HTML、API 接口、用户上传内容等必须避免长效缓存:
- HTML 文件建议设为:
location ~ \.html$ {
expires -1;
add_header Cache-Control "no-cache";
} - 动态接口(如
/api/)或上传目录(如/uploads/)不应配置expires,或仅设短时效(如expires 7d); - 确保服务器系统时间准确,Nginx 依赖本地时间生成
Expires头,偏差大会导致缓存提前失效或拒绝使用。











