try_files不直接检查目录存在性,而是按序匹配文件或uri,首个存在即处理;配合index指令与$uri/可实现“目录存在则加载其index文件,否则fallback”的效果。

try_files 本身不直接“检查目录是否存在”,它按顺序尝试匹配文件或 URI,遇到第一个存在的路径就停止并交给后续指令处理。但你可以利用它的行为,配合 alias 或 root 和内部重定向,实现“先查目录、存在则进目录首页,否则 fallback”的效果。
核心思路:用 try_files 触发内部重定向到目录索引
Nginx 不会把 /path/ 当作目录“存在性检查”,而是当作一个 URI 去找对应的文件(如 /path/index.html)。所以正确做法是:
- 让
try_files尝试该路径下常见的索引文件(如index.html、index.php) - 如果都不存在,再 fallback 到一个命名 location 或 URI,由它统一处理(比如返回 404、重写、或代理)
- 关键点:目录本身无需显式判断——只要配置了
index指令,且try_files最后一项指向该目录(以/结尾),Nginx 就会自动查找其索引文件
常见场景示例:静态站点目录路由
假设你希望访问 /blog/ 时,若 /var/www/blog/ 目录存在且含 index.html,就显示它;否则返回 404:
location /blog/ {
alias /var/www/blog/;
index index.html;
try_files $uri $uri/ =404;
}
说明:
-
$uri→ 查/var/www/blog/some-path(无扩展名也查) -
$uri/→ 自动补/后触发index指令,即查/var/www/blog/some-path/index.html;若访问的是/blog/,则查/var/www/blog/index.html -
=404→ 所有尝试失败,直接返回 404
进阶:目录存在但无 index 文件时 fallback 到 PHP 或 API
比如想让 /api/v1/ 下的请求,优先走本地文件,没有则交给后端 PHP 处理:
location /api/v1/ {
alias /opt/app/api/;
try_files $uri $uri/ /api/v1/index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
注意:$uri/ 这一步仍依赖 index 指令才能生效;若没配 index,$uri/ 本身不会自动找 index.php,需显式写成 $uri/index.php。
重要提醒:root vs alias 的区别影响路径拼接
使用 try_files 时,root 和 alias 对 $uri 的拼接逻辑不同:
-
root /var/www;+location /blog/ { ... }→$uri是/blog/file.txt,完整路径为/var/www/blog/file.txt -
alias /var/www/blog/;+location /blog/ { ... }→$uri是/blog/file.txt,但去掉前缀后拼成/var/www/blog/file.txt - 用
alias时,try_files $uri/的/必须和location的结尾一致(都带/),否则可能路径错乱











