排查 alias 与 try_files 联合使用路径错位,关键看 error_log 中 open() 失败路径(如多余 // 或路径过短),用 $request_filename 日志确认真实拼接路径,避免在 alias 块中误用 $uri 或以 / 开头的 fallback,应改用 $request_filename;必要时用 strace 追踪 openat() 系统调用验证。

排查 alias 与 try_files 联合使用时的路径错位,核心是确认 Nginx 实际查找的物理路径是否符合预期。错误往往藏在拼接逻辑里,而不是配置语法本身。
看 error_log 中的 open() 失败路径
开启或检查 Nginx 错误日志(建议设为 warn 或 debug 级别),重点观察类似这样的行:
-
open() "/var/www/assets//static/js/app.js" failed (2: No such file or directory) → 多余的
//暴露了 $uri 被错误拼接到 alias 目录后 -
stat() "/data/uploads/media/photo.jpg" failed → 实际查找路径比预期短,可能是 alias 末尾缺
/导致 URI 截断
用 $request_filename 验证真实路径
在对应 location 块中临时加一行日志输出,确认 Nginx 内部拼接结果:
log_format debug_log 'req: "$request" | uri: "$uri" | request_filename: "$request_filename"';access_log /var/log/nginx/debug.log debug_log;- 访问一次资源,查看日志中
$request_filename是否指向你期望的磁盘路径(如/var/www/my-app/dist/index.html)
避免依赖 $uri 和相对 fallback
alias 块内慎用 try_files $uri =404 或 try_files $uri /index.html,因为:
-
$uri是原始请求路径(如/admin/js/main.js),不会被 alias 自动映射 -
/index.html这类以/开头的 fallback 会按 root 解析,和 alias 无关,极易错位 - 正确写法应为:
try_files $request_filename $request_filename/ /var/www/my-app/dist/index.html;
用 strace 观察系统调用
当日志不够明确时,可直接跟踪 Nginx worker 进程的文件打开行为:
strace -p $(pidof nginx) -e trace=openat,stat -f 2>&1 | grep -E "(failed|dist|assets)"- 触发一次请求,观察输出中真正被
openat()尝试打开的路径,这是最接近真相的依据











