root定义物理路径基址,try_files按序拼接$uri等参数查找文件:$uri拼为/var/www/uri,$uri/查目录,/index.html拼为/var/www/index.html;禁用/$uri防双斜杠错误。

关键在于理解 root 定义的是物理路径基址,而 try_files 的每个非末尾参数都是相对于这个基址的“拼接路径”——拼得准,才能找得到。
root 提供根目录,try_files 负责按序拼接检查
root /var/www; 表示所有静态资源从 /var/www/ 开始查找。try_files $uri $uri/ /index.html; 中:
- $uri(如 /app/js/main.js)拼成 /var/www/app/js/main.js
- $uri/(即 /app/js/main.js/)拼成 /var/www/app/js/main.js/ —— 这是目录检查,不是文件
- /index.html 拼成 /var/www/index.html
注意:$uri 原样保留开头的 /,所以不能写成 /$uri,否则会变成 /var/www//app/js/main.js(双斜杠),绝大多数情况下不存在。
常见拼接错误与安全写法
- ❌ 错误:
try_files $uri /$uri /index.html;→ 第二项多出一个/,路径错位 - ✅ 正确:
try_files $uri $uri/ /index.html;→ 分别查文件、查同名目录、兜底根页 - ✅ SPA 路由常用:
try_files $uri $uri/ /index.html;,确保前端路由刷新不 404 - ✅ 灰度资源 fallback:
try_files /v2$uri /v1$uri /fallback.html;,版本路径前缀直接拼在变量前
目录访问时的隐含行为
当请求为 /admin/(结尾带斜杠),$uri 就是 /admin/:
- try_files $uri $uri/index.html =404;:先查 /var/www/admin/ 是否为目录;若是,再查其下是否有 index.html(依赖 index 指令)
- try_files $uri/ /index.html;:等价于先查目录,命中即返回(Nginx 自动按 index 列表找默认页)
- 若只想 fallback 到根页,不用 $uri/,直接用 /index.html 即可
调试路径是否拼对的两个实用方法
- 开启 debug 日志:
error_log /path/to/debug.log debug;,日志中会出现类似trying to use file: "/app.js" "/var/www/app.js"的行,明确显示拼接结果 - 临时加日志变量:
log_format debug '$request $document_root$request_filename';,配合$request_filename可直观看到最终构造的绝对路径











