Nginx 中 root 确保文件路径正确,expires 设置强缓存头,二者协同才能实现长期缓存;root 拼接 URI 生成真实路径,若出错则返回 404/403,expires 不生效;需按扩展名精准匹配 location,配合 expires 1y 和 immutable 提升缓存效率,并通过构建哈希文件名保证更新生效。

Linux 下用 Nginx 的 root 指令配合 expires 实现长期缓存,核心不是“root 控制缓存”,而是 root 确保文件能被正确找到,expires 才能在响应中写入强缓存头。两者必须协同——路径映射错,缓存就无从谈起。
root 决定文件能不能被读到,这是前提
root 的作用是把请求 URI 拼接到指定目录后,生成真实磁盘路径。它不处理缓存,但若拼错,Nginx 返回 404 或 403,expires 根本不会生效。
- 配置
root /opt/myapp;+location /static/ { },请求/static/css/app.css→ 实际查找/opt/myapp/static/css/app.css - URI 前缀(如
/static/)完整保留,root不会自动截掉它 - 常见错误:路径权限不足、末尾多斜杠引发 alias 混用冲突、location 前缀与实际 URI 不一致
expires 要放在能成功返回静态内容的 location 里
只有当该 location 真正命中并返回了文件(状态码 200),expires 设置的响应头才会发出。建议按扩展名精准匹配,避免误缓存 HTML 或 API。
- 推荐写法:
location ~* \.(js|css|png|jpg|webp|woff2)$ { root /opt/myapp; expires 1y; add_header Cache-Control "public, immutable"; } -
expires 1y等价于max-age=31536000,比expires max更明确可控 - 加
immutable可跳过协商请求(如 If-None-Match),提升强缓存效率
长期缓存真正生效,靠的是资源路径稳定
即使 expires 1y 生效,如果 JS 或图片文件名不变(比如始终是 app.js),内容更新后用户仍看到旧版。这不是 Nginx 的问题,而是缓存机制本身的要求。
- 构建时必须生成带哈希的文件名,例如
app.a1b2c3.js,HTML 中引用该唯一 URL - 静态资源目录(如
/static/)应与动态内容(如/api/、/uploads/)严格分离 - 用户上传类图片建议用短缓存(
expires 1h)或禁用缓存(expires off)
验证是否配置成功
部署后打开浏览器开发者工具 → Network 标签 → 刷新一个静态资源(如 logo.png):
- 响应头中应有
Cache-Control: public, immutable, max-age=31536000 - 应有
Expires字段,值为当前时间加 1 年左右 - 第二次访问同一 URL,状态码显示
200 (from memory cache)或200 (from disk cache),而非304


















