root指令仅负责URI拼接生成文件路径,缓存由expires和add_header Cache-Control控制,二者须置于匹配静态资源的location块内;root路径需准确,避免前缀错配或权限问题;不同资源应差异化配置缓存策略。

root 指令本身不控制缓存,它只负责把请求 URI 拼接到指定目录,生成真实文件路径;真正控制浏览器缓存行为的是 expires 和 add_header Cache-Control。二者必须配合使用,且要放在能正确命中静态文件的 location 块里,否则缓存策略不会生效。
root 路径映射要准确
root 是“拼接”逻辑:Nginx 把整个请求 URI(含前缀)加到 root 路径后面。
比如:
- 配置
root /var/www/html;+location /static/ { } - 请求
/static/js/app.js→ 实际读取/var/www/html/static/js/app.js
常见坑点:
- root 路径末尾多写
/一般不影响,但和 alias 混用时容易错乱 - location 前缀没对齐(如配了
/img却请求/images/logo.png),会导致 404,缓存自然不触发 - 目录权限不足或文件不存在,Nginx 日志会报
Permission denied或No such file,此时 expires 完全不执行
expires 必须写在匹配静态资源的 location 块内
expires 不继承、不跨块生效。写在 server 或 http 层,对 root 下的静态响应无效,除非该 location 没有自己定义 expires。
正确写法示例:
location ~* \.(js|css|png|jpg|gif|ico|svg)$ {
root /opt/myapp;
expires 1y;
add_header Cache-Control "public, immutable, max-age=31536000";
}这样所有匹配的静态请求,都会走 root 映射 + 缓存头设置。
静态资源带哈希时建议设为永久缓存
如果文件名自带哈希(如 app.a1b2c3.js),说明内容不变,适合长期缓存:
-
expires max;→ 等效于Expires: Thu, 31 Dec 2037 23:55:55 GMT - 加
add_header Cache-Control "public, immutable";,让浏览器跳过验证,直接复用
注意:immutable 只在现代浏览器生效,搭配 max-age 更稳妥。
不同资源类型可差异化配置
不必一刀切。例如:
- 图片、字体、JS/CSS →
expires 1y; add_header Cache-Control "public, immutable" - HTML 文件(常变动)→
expires -1; add_header Cache-Control "no-cache, must-revalidate" - favicon.ico → 单独配
location = /favicon.ico { root /var/www/static; expires 7d; }
只要 location 能精准匹配,root 找到文件,expires 就能生效。
不复杂但容易忽略


















