关键在于try_files未成功fallback,主因是location匹配错位、路径配置错误或优先级干扰:需确保其置于覆盖请求的location块内,$uri/$uri/真实存在且权限正确,alias需同步调整fallback路径,root必须精确指向构建产物目录。

排查 try_files 找不到文件时触发默认 404,关键不是“它为什么返回 404”,而是“它本该 fallback 却没 fallback 成功”——多数问题出在路径匹配逻辑被意外绕过或覆盖。
检查 try_files 是否落在正确的 location 块中
try_files 必须写在能覆盖目标请求的 location 里。常见盲点:
- 把 try_files 错误地写在 server 块顶层(无 location 包裹),Nginx 不会执行它
- 只配在 location /static/ 这类子路径下,但前端路由如 /user/profile 走的是 location /,结果没被兜底
- 用了 alias 指令却没同步调整 try_files 的 fallback 路径(例如 alias /app/; 时,/index.html 应改为 /app/index.html)
确认 $uri 和 $uri/ 对应的真实路径是否存在
try_files 按顺序检查:$uri → $uri/ → /index.html。若前两项之一“看似存在”,就会中断流程,跳过兜底:
- $uri 匹配到一个空文件、权限不足的文件,或软链接失效,Nginx 可能静默返回 404(不报错但不继续)
- $uri/ 对应目录存在,但里面没有 index.html 或未配置 index index.html;,Nginx 默认不自动索引,直接 404
- 目录存在且有 index.html,但 autoindex on; 开启了,反而可能暴露列表而非返回 index.html(建议显式关闭:autoindex off;)
排除 location 优先级干扰和路径截断
Nginx 按最长前缀匹配 location,高优匹配会跳过通用 / 块里的 try_files:
- 若配置了 location ^~ /api/ 或 location ~ \.js$,但规则写在 location / 之后,且未正确终止匹配(如漏掉 last 或 break),可能导致请求被错误转发或中断
- 正则 location(location ~)一旦匹配,就不会再进入 location /,所以静态资源正则块里如果也写了 try_files,必须确保它不干扰主兜底逻辑
- 使用 proxy_pass 时,末尾斜杠缺失会导致路径拼接异常,让 $uri 实际值与预期不符(例如 proxy_pass http://backend 不加 /,访问 /api/user 会透传为 /api/user,而加 / 则变为 /user)
验证 root 路径与文件物理位置是否一致
try_files 中的 $uri 是相对于 root(或 alias)拼接的。路径错一点,就完全找不到:
- 构建产物放在 /var/www/myapp/dist,但 Nginx 配置的是 root /var/www/myapp; → $uri /js/app.js 实际查的是 /var/www/myapp/js/app.js,自然 404
- 用 alias 时,alias 后路径必须以 / 结尾,且不包含 location 路径前缀(例如 location /admin/ { alias /var/www/myapp/dist/; },那么请求 /admin/js/app.js 对应物理路径是 /var/www/myapp/dist/js/app.js)
- Linux 区分大小写,/Index.html ≠ /index.html;检查实际文件名是否拼写一致











