ThinkPHP 8 默认不启用 PATH_INFO,仅当配置 'url_pathinfo' => true 或有特定兼容需求时才需 Nginx 精准支持;须用 fastcgi_split_path_info 提取并注入 PATH_INFO,root 必须指向 public 目录,否则报错。

ThinkPHP 8 默认不依赖 PATH_INFO,而是优先从 $_SERVER['REQUEST_URI'] 或 $_SERVER['QUERY_STRING'] 解析路由。但如果你的项目明确需要兼容 PATH_INFO 模式(比如对接老系统、调试需要或部分中间件强依赖),Nginx 配置必须精准支持,否则会直接白屏或报 “URL pathinfo not supported” 错误。
确认是否真需启用 PATH_INFO
TP8 官方默认关闭 PATH_INFO 路由解析。除非你做了以下任一操作,否则无需配置:
- 在
config/app.php中显式设置了'url_pathinfo' => true - 使用了自定义中间件或扩展,强制读取
$_SERVER['PATH_INFO'] - 部署环境受限(如某些云函数或老旧网关)只允许 PATH_INFO 传参方式
PHP location 块必须添加 PATH_INFO 提取逻辑
仅靠 try_files 不够——它不生成 PATH_INFO。你需要在处理 PHP 的 location 块中手动提取并注入:
- 删除所有
if ($fastcgi_script_name ~ ...)类正则判断(易因匹配失败导致$path_info为空,引发 502) - 改用更安全的
fastcgi_split_path_info指令:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
立即学习“PHP免费学习笔记(深入)”;
注意:$realpath_root 必须启用(不能写成 $document_root),否则 TP8 自动加载器无法定位 autoload.php。
入口路径与 root 必须严格对应
PATH_INFO 模式下,Nginx 必须把请求准确转发到 /public/index.php,且 root 必须指向 public/ 目录:
-
root /www/wwwroot/myapp/public;✅(正确) -
root /www/wwwroot/myapp;❌(会导致 Class 'think\App' not found 且无错误提示) - 访问地址为
https://site.com/subdir/时,location /subdir/内需重写为/subdir/index.php,并补全fastcgi_param SCRIPT_NAME /subdir/index.php;
验证 PATH_INFO 是否送达
在 public/index.php 开头临时加一行:
var_dump($_SERVER['PATH_INFO'] ?? 'MISSING');
访问任意带路径的 URL(如 /index/user/list),若输出为 string(12) "/index/user/list",说明已通;若为 MISSING 或空字符串,说明 Nginx 未传递或提取失败,需回查 fastcgi_split_path_info 和 SCRIPT_FILENAME 路径拼接。



















