nginx的root指令将请求uri(去掉开头/)直接拼接在绝对物理路径后查找文件;location /admin/ { root /var/www/assets; }会查找/var/www/assets/v3/dashboard.js,要求磁盘路径真实存在且权限正确。

用 root 指令配置多级子目录的静态网站,关键不是“写多层路径”,而是理解 Nginx 如何把请求 URI 和 root 路径拼起来找文件。它不自动创建目录结构,只按规则查找磁盘上真实存在的路径。
root 的拼接逻辑必须清楚
root 后面跟的是一个**绝对物理路径**,Nginx 会把请求地址中 去掉开头 / 后的完整路径 直接拼在 root 后面。
- 配置:
root /srv/www/myapp; - 访问
/user/profile/edit.html→ 查找/srv/www/myapp/user/profile/edit.html - 访问
/→ 查找/srv/www/myapp/index.html(前提是启用了index index.html;)
多级子目录映射的典型写法
如果 URL 路径和磁盘路径层级一致,直接用 location + root 即可,无需 alias 或重写。
- 想让
/admin/v3/dashboard.js对应/var/www/assets/admin/v3/dashboard.js,就写:
root /var/www/assets;
}
注意:这里 /admin/ 是 location 前缀,Nginx 会把 /admin/v3/dashboard.js 中的 v3/dashboard.js 拼到 /var/www/assets 后面,最终找 /var/www/assets/v3/dashboard.js —— 所以磁盘上必须有 /var/www/assets/v3/ 这个子目录。
- 同理,支持多个独立子目录:
root /opt/docs;
}
location /legacy/ {
root /srv/old-site;
}
常见错误要避开
很多 404 其实是因为路径拼错了,而不是文件不存在。
-
别在 root 后多加一层 location 名字:比如 location /static/ 下写
root /data/assets/static;,会导致请求 /static/logo.png 实际去找/data/assets/static/static/logo.png(多了一个 static/) - 确保磁盘路径真实存在且权限正确:Nginx 工作用户(如 www-data 或 nginx)必须对整个路径有读取权限,包括中间每一级目录
- 不要混用 root 和 alias 在同一 location:它们行为完全不同,混用容易导致路径错位;一般 location / 用 root,location /xxx/ 优先考虑 alias(更直观)
配合 try_files 支持前端路由
如果是 Vue/React 等单页应用,URL 多级但实际只有一个 index.html,可以这样兜底:
location / {root /var/www/spa;
try_files $uri $uri/ /index.html;
}
这样访问 /user/settings 时,先找文件,找不到就回退到 /index.html,由前端路由接管。











