try_files是Nginx按顺序检查文件或目录存在性并返回首个匹配资源的指令,用于SPA路由兜底、静态资源多级fallback等场景;语法为try_files file1 file2 ... uri;,依次检查各路径,全部失败则内部重定向到最后的uri。

try_files 是 Nginx 中用于按顺序检查文件或目录是否存在,并在找到第一个匹配项时立即返回该资源的指令。它常用于前端单页应用(如 Vue、React)的 history 模式路由回退,或静态资源兜底处理。
基本语法和执行逻辑
语法格式为:
try_files file1 file2 ... uri;含义是:依次检查 file1、file2 … 是否存在且可读;若都不存在,则内部重定向到最后的 uri(必须以 / 开头,表示 URI 路径,不是文件路径)。
注意:
- 检查的是服务器上的**文件系统路径**,但路径由 Nginx 自动拼接:基于 root 或 alias 指令计算出绝对路径;
- 最后一个参数必须是 URI(如 /index.html 或 /backend.php),不能是文件路径;
- 一旦命中某个文件,Nginx 直接返回它,不再继续后续检查。
常见用法示例
1. SPA 前端路由兜底(最典型场景)
当用户直接访问 /user/profile 这类前端路由时,后端没有对应真实文件,需回退到 index.html 让 JS 路由接管:
root /var/www/myapp;
try_files $uri $uri/ /index.html;
}
-
$uri:尝试匹配精确路径,如/var/www/myapp/user/profile; -
$uri/:尝试作为目录访问(会自动加/并检查 index 文件); -
/index.html:全部失败后,内部重定向至此 URI,最终返回/var/www/myapp/index.html。
2. 静态资源多级 fallback
比如优先找带版本号的文件,再找普通文件,最后回退到 CDN 备份地址:
location /static/ {root /var/www/assets;
try_files /v2$uri /v1$uri $uri =404;
}
- 请求
/static/js/app.js会依次检查:/var/www/assets/v2/static/js/app.js→/var/www/assets/v1/static/js/app.js→/var/www/assets/static/js/app.js; - 都不存在则返回 404(
=404是特殊写法,表示直接返回该状态码)。
关键注意事项
-
try_files后面所有路径(除最后一个)都**不支持变量拼接以外的复杂表达式**,比如不能写$uri.html?version=1; -
$uri/的行为依赖index指令,默认为index index.html,若目录下无 index 文件,仍算“不存在”; - 最后一个参数如果是命名 location(如
@php),需确保该 location 存在且能处理请求; - 避免错误写成
try_files $uri /index.html /index.html—— 重复路径无意义,且可能引发循环重定向。
调试技巧
若行为不符合预期,可通过以下方式排查:
- 开启 Nginx 错误日志(
error_log /var/log/nginx/error.log debug;),查看实际检查了哪些路径; - 用
curl -I检查响应头中的X-Accel-Redirect或状态码变化; - 确认
root路径权限正确,Nginx worker 进程可读目标文件。


















