root本质是路径拼接,将完整URI(含location前缀)原样追加到指定目录后,如location /api/ { root /opt/app; }访问/api/v1/user时查找/opt/app/api/v1/user;alias才是路径替换,会剥离location前缀。

Root 指令的本质是“路径拼接”,不是“路径替换”——它把请求的完整 URI 路径(从 / 开始)直接加到 root 指定的目录后面,中间不做任何截断或剥离。
root 的拼接逻辑很直白
只要 location 命中,Nginx 就会把用户访问的原始 URI 全路径,原封不动地追加到 root 设置的目录末尾。
- 比如请求
/api/v1/user,location 配置为location /api/ { root /opt/app; },实际查找的是/opt/app/api/v1/user - 再比如请求
/blog/post-123.html,location 是location ~ ^/blog/.*\.html$ { root /srv/www; },实际路径仍是/srv/www/blog/post-123.html,正则只管匹配,不参与路径构造 - 哪怕 location 写成
location /a/b/c/ { root /data; },访问/a/b/c/index.html,也会去查/data/a/b/c/index.html,而不是/data/index.html
location 前缀不会被自动去掉
很多人误以为写 location /static/ + root /var/www 就能让所有请求落到 /var/www 下,其实不然——/static/ 这段路径仍会保留在拼接结果里。
- 所以
/static/css/main.css→/var/www/static/css/main.css,不是/var/www/css/main.css - 如果目标是后者,就不能用 root,得改用
alias /var/www/;(注意末尾斜杠),这样 Nginx 才会把/static/整个替换掉 - server 块里的 root 只是默认值,一旦 location 里写了 root,就完全覆盖,不叠加、不继承
什么时候该用 root,什么时候该换 alias
选 root 的典型场景:你希望保持 URI 结构和文件系统结构一致,比如站点根目录统一放在 /var/www/html,所有子路径自然延伸下去。
-
location / { root /var/www/html; }→/about对应/var/www/html/about -
location /admin/ { root /opt/myapp; }→/admin/js/app.js对应/opt/myapp/admin/js/app.js
选 alias 的典型场景:你要把某个 URI 前缀“映射到”另一个位置,且不希望保留前缀。
-
location /media/ { alias /mnt/storage/; }→/media/photo.jpg查找/mnt/storage/photo.jpg -
location ~ ^/files/(.+)$ { alias /home/uploads/$1; }→/files/report.pdf查找/home/uploads/report.pdf
index 和拼接是独立运作的
即使 root 拼出的是一个目录路径,index 指令仍会生效——前提是那个目录真实存在,且里面包含指定的索引文件(如 index.html)。
location /docs/ { root /usr/share; index index.md; }- 访问
/docs/→ 拼出/usr/share/docs/→ 若该目录下有index.md,就返回它;否则可能返回 403 或目录列表(取决于 autoindex)


















