root是拼接(完整URI追加到目录后),要求磁盘存在对应子路径;alias是替换(剥离location前缀后拼接剩余URI),不依赖磁盘层级结构,且alias值末尾必须加/。

root 和 alias 都是用来把 URL 请求映射到服务器文件路径的指令,但它们的拼接逻辑完全不同——root 是拼接,alias 是替换。用错一个,静态资源就 404,而且错误很难一眼看出来。
root:URI 全部追加到指定目录后面
无论 location 怎么写,root 都会把完整的请求 URI(包括匹配到的前缀)原封不动地接到它指定的路径末尾。
- 配置:location /static/ { root /var/www/html; }
- 请求:/static/js/app.js
- 实际查找路径:/var/www/html/static/js/app.js(注意:/static/ 出现了两次)
这意味着你的磁盘上必须真实存在 /var/www/html/static/ 这个子目录。root 适合 URL 路径和磁盘目录结构一致的场景,比如整个站点都放在一个根目录下。
alias:location 匹配部分被完全替换掉
alias 把 location 中匹配到的那部分 URI 前缀,直接替换成 alias 后面写的路径。它不保留原始前缀,只保留 URI 剩下的部分。
- 配置:location /static/ { alias /var/www/html/assets/; }(注意结尾必须有
/) - 请求:/static/js/app.js
- 实际查找路径:/var/www/html/assets/js/app.js(/static/ 消失了,只留下 js/app.js)
alias 更灵活,常用于把某个 URL 路径“虚拟”指向另一个物理位置,比如把 /api/ 映射到后端临时目录,或把 /uploads/ 指向独立挂载的磁盘分区。
关键细节不能忽略
-
alias 必须以
/结尾,否则 Nginx 会把它当成文件处理,导致 404;root 末尾加不加/都可以。 - alias 只能出现在 location 块里;root 可以在 http、server、location 任意层级使用。
- 如果 location 用正则(比如
location ~ \.js$),alias 必须配合捕获组使用,例如alias /data/$1/;,否则会报错。 - 调试时可加日志查看真实路径:
log_format debug '$request_filename - $request_uri';,再用access_log /var/log/nginx/debug.log debug;。
选哪个,取决于你想要的映射关系:要保持 URL 和目录一一对应,用 root;想把某段 URL “跳转”到别的地方,用 alias。


















