必须用try_files是因为if(!-e $request_filename)在windows、php 8.2+及path_info处理中极不稳定,易致$_server['path_info']为空;try_files是nginx原生命令,按序检查静态文件、目录,最后交由/index.php?$query_string统一处理,不依赖path_info,兼容tp5/6/8默认路由模式。

要加,而且必须用 try_files,不能用 if 判断。
为什么必须用 try_files
ThinkPHP(尤其是 6.x 和 8.x)在 Nginx 下出现 404、白屏、路由失效,90% 是因为用了 if (!-e $request_filename) 这类旧规则。它在 Windows 环境、PHP 8.2+、以及 PATH_INFO 处理上极不稳定,容易导致 $_SERVER['PATH_INFO'] 为空,框架连入口都进不去。
try_files 是 Nginx 原生命令,按顺序检查:
• 先找真实静态文件(如 /logo.png)
• 再找目录(如 /admin/)
• 都不命中时,才交由 /index.php 统一处理,并完整保留 QUERY_STRING
这个过程不依赖 PATH_INFO,绕过解析陷阱,兼容 TP5/6/8 的默认路由模式(s 参数或 querystring 模式)。
标准配置写法
在 server 块内的 location / { } 中写:
location / {-
index index.php index.html; -
try_files $uri $uri/ /index.php?$query_string; }
注意三点:
• 结尾必须是 /index.php?$query_string,不是 /index.php/$1 或 /index.php?s=$1(除非你明确改过框架的 URL 获取方式)
• root 必须指向项目 public/ 目录,例如 root /var/www/myapp/public;
• 删除所有 if 块,包括注释掉的也建议清空
子目录部署怎么处理
如果访问地址是 https://example.com/myapp/,不要只改 location /,而应:
- 保持主
location /不变(用于其他资源) - 新增专用块:
location /myapp/ { try_files $uri $uri/ /myapp/index.php?$query_string; } - 确保
root指向站点根目录(如/var/www/example.com),且/myapp/public/是实际路径
这样能避免路径前缀被截断,s= 或路由参数不会丢失。
配套 PHP 块不能漏
在 location ~ \.php$ 块中,必须包含这三行:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param QUERY_STRING $query_string;
特别强调:$realpath_root 不是 $document_root——ThinkPHP 8 强制依赖它解析自动加载路径,写错会导致 Fatal error: Class 'think\App' not found 且无任何提示。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











