root指令不继承,location中root完全覆盖server级root;alias则截去匹配前缀后再拼接,更适合URI前缀映射。

在 Nginx 中,root 指令**不继承**——它在 server 块和 location 块中是独立生效的,且 location 块中的 root 会完全覆盖(而非追加或补充)上级 server 块中定义的 root。
server 块中的 root 是默认根目录
当请求未匹配到任何 location 块,或匹配的 location 块中未显式设置 root(或 alias),Nginx 会使用 server 级的 root 来拼接文件路径。
例如:
server {
listen 80;
server_name example.com;
root /var/www/html;
<pre class='brush:php;toolbar:false;'>location / {
# 未设 root → 使用 server 级 root
# 请求 /index.html → 映射为 /var/www/html/index.html
}}
location 块中的 root 会完全替代 server 级 root
location 内定义的 root 不是“追加”到 server 的 root 后面,而是直接替换整个根路径。Nginx 会丢弃 server 级的 root,仅用 location 中指定的路径作为新根。
例如:
server {
root /var/www/default;
<pre class='brush:php;toolbar:false;'>location /api/ {
root /opt/backend;
# 请求 /api/v1/users → 实际查找 /opt/backend/api/v1/users
# 注意:/api/ 被原样拼接到 /opt/backend 后,不是 /opt/backend/v1/users
}}
- 这是关键点:location 的
root+ 完整 URI 路径 = 最终文件系统路径 - 所以
root /opt/backend;+ URI/api/v1/data.json→ 文件路径是/opt/backend/api/v1/data.json
想让 /api/ 映射到 /opt/backend/v1/?用 alias 更合适
如果目标是把某个 URI 前缀“映射为”另一个目录的“起始位置”,应优先使用 alias,因为它会**截掉匹配的 location 前缀**再拼接。
对比示例:
location /api/ {
alias /opt/backend/v1/;
# 请求 /api/users → 查找 /opt/backend/v1/users
# 请求 /api/ → 查找 /opt/backend/v1/(注意末尾斜杠)
}
-
alias要求 location 以/结尾,且 alias 值也建议以/结尾 -
alias和root行为本质不同:一个“替换前缀”,一个“重设根并保留完整 URI” - 混用
root和带正则的location易出错,此时alias更可控
多个 location 共享 server 级 root?可以,但需不覆盖
只要 location 块里不写 root,就自动沿用 server 级的值。适合多路径共用同一站点根目录的场景:
server {
root /var/www/site;
location / {
# → /var/www/site/index.html
}
location /static/ {
# → /var/www/site/static/css/app.css
}
location /admin/ {
auth_basic "Admin";
# → /var/www/site/admin/index.html
}
}
- 这种写法简洁、可维护性强
- 若某 location 需要特殊路径,才单独加
root或alias - 注意:rewrite 或 try_files 可能影响实际路径解析,需结合验证

















