选 root 还是 alias 取决于 URL 路径与磁盘目录是否名称一致:一致用 root,不一致必须用 alias;root 要求结构镜像,alias 支持解耦映射,二者不可混用且需斜杠对齐。

选 root 还是 alias,本质是判断 URL 路径和磁盘目录是否“名字对得上”:对得上,用 root;对不上,必须用 alias。这不是风格偏好,而是路径解析逻辑的硬约束——错配直接导致 404 或文件错位。
root 的适用边界:结构镜像,整站或同名子路径
root 把完整请求 URI(含 location 前缀)原样拼到指定路径后。它要求磁盘上真实存在与 URL 层级一致的子目录。
- 整站部署 Vue/React 构建产物时,推荐用 location / { root /var/www/myapp/dist/; } —— 此时
/→/dist/index.html,结构天然匹配,无需额外层级 - 挂载同名子站(如
/blog/、/docs/)时,root 要求/var/www/static/blog/和/var/www/static/docs/必须真实存在 - location / 不可用 alias:匹配全量请求时,alias 无法安全替换空字符串,易引发路径越界或 index 文件失效,root 是唯一合理选择
alias 的适用边界:解耦映射,跨命名挂载
alias 会把 location 匹配部分整个去掉,只将剩余 URI 拼到目标路径后。它不依赖磁盘层级,但书写规范极严。
- URL 与磁盘路径名称无关时必须用 alias,例如:
/api/docs/→/opt/swagger-ui/,或/cdn/→/srv/fastly/assets/ -
alias 值末尾必须加 /:写成
alias /srv/assets(缺/),请求/cdn/logo.png就会变成/srv/assetslogo.png—— 斜杠缺失导致路径粘连 - 多个子路径映射到同一物理目录不同子集(如
/css/、/js/都指向/dist/),alias 更清晰可控,避免重复建目录
配置协同边界:不能混用、斜杠对齐、try_files 前缀一致
root 和 alias 在同一 location 块中互斥,Nginx 启动即报错;且它们与 try_files、防盗链等指令的配合有明确上下文要求。
- 防盗链必须与 root/alias 同 location:valid_referers + if($invalid_referer) 只在同级 location 中生效;若 root 写在 server 级,防盗链规则就失去路径上下文
-
location 最好以 / 结尾(如
/admin/),避免/adminfile.js这类误匹配;正则 location 中用 alias 需显式捕获(如location ~ ^/static/(?)css|js)/(.*)$ { alias /data/assets/$type/$2; } -
try_files fallback 要带 location 前缀:alias 下写
try_files $uri $uri/ /admin/index.html;,其中/admin/index.html必须包含前缀,否则 Vue Router history 模式无法回退
目录结构规范边界:由指令反向约束存放方式
root 和 alias 不是目录设计工具,而是强制你按其逻辑组织文件——否则 404 就是必然结果。
- 用 root 时,
/var/www/project/dist/下必须有web/子目录,才能支持location /web { root /var/www/project/dist; } - 用 alias 时,物理路径可任意命名:
/api/v1/docs/映射到/opt/swagger-ui/,完全不用在/opt/下建api/v1/docs/ - 推荐范式:整站用 root,子应用/外部资源挂载用 alias;所有 alias 路径统一以
/结尾,所有 location 也建议以/结尾,减少歧义











