Nginx中root指令的绝对路径= root值 + 请求URI完整路径(含location前缀),不截断、不替换;例如location /api/v2/ { root /data; }处理/api/v2/static/logo.png时,实际查找/data/api/v2/static/logo.png。
计算 Nginx 多级目录嵌套下 root 指令的绝对路径,关键不是“算”,而是理解它如何拼接:root 值 + 请求 URI 的完整路径(不含协议、域名、端口和查询参数),且不删减 location 匹配部分。
无论 location 是 /a/、/a/b/c/ 还是 /api/v2/static/,只要命中该 location,Nginx 就会:
/api/v2/static/logo.png)/ 和所有层级)/var/www/assets)和这个 URI **直接拼在一起**/var/www/assets/api/v2/static/logo.png
很多人以为 location 匹配的部分会被“去掉”或“截断”,其实不会。root 不做任何替换,只做追加:
location /api/v2/ { root /data; } → 认为“/api/v2/”被替换了,所以找 /data/static/logo.png
/api/v2/static/logo.png → 查找 /data/api/v2/static/logo.png
若你希望 /api/v2/static/ 映射到 /opt/cdn/static/ 这类“去前缀”的场景,不要用 root,改用 alias:
location /api/v2/static/ { alias /opt/cdn/static/; } → 请求 /api/v2/static/img.jpg 查找 /opt/cdn/static/img.jpg
/,否则可能因路径拼接出错导致 404/app/ 下,而代码就放在 /var/www/app/)最可靠的方式是看错误日志:
/a/b/c/test.xyz)logs/error.log,Nginx 会明确打印类似:"open() "/var/www/a/b/c/test.xyz" failed (2: No such file or directory)"