核心是Nginx未正确传递PATH_INFO及SCRIPT_FILENAME,需修正伪静态规则(用try_files $uri $uri/ /index.php?$query_string)、启用cgi.fix_pathinfo=1、将根目录设为public并精确配置open_basedir。

ThinkPHP 6.1 出现 “No input file specified” 错误,核心是 Nginx 没能把请求正确交给 index.php,同时 PHP 无法识别 PATH_INFO 或 SCRIPT_FILENAME 路径无效。这不是 ThinkPHP 自身问题,而是 Web 服务器与 PHP 协同环节断了。修复需聚焦三点:重写规则是否兜住请求、PATH_INFO 是否可靠传递、路径权限是否严格匹配。
检查并修正 Nginx 伪静态规则(关键)
TP6.1 默认使用 PATH_INFO 模式路由(如 /index/user/list),Nginx 必须把这类请求显式转给 index.php,并提取出有效 PATH_INFO。
- 进入宝塔【网站】→ 对应站点【设置】→ 【配置文件】,找到
location / { }块,确保只有一条标准try_files规则:try_files $uri $uri/ /index.php?$query_string; - 重点:不要用
/index.php?s=$1这类 TP5 风格写法,TP6.1 不兼容;也不要写成/index.php$uri,会导致 PATH_INFO 丢失 - 在
location ~ \.php(.*)?$ { }块内,确认存在且未注释这两行:fastcgi_split_path_info ^(.+\.php)(/.+)$;<br>fastcgi_param PATH_INFO $fastcgi_path_info;
- 保存后务必点击【重载配置】,仅重启 Nginx 不生效
启用并验证 PATH_INFO 支持
PHP 默认可能禁用 PATH_INFO 解析,尤其 PHP 7.4+ 版本。TP6.1 的路由依赖它,关闭即报错。
- 进【网站】→ 站点【设置】→ 【PHP版本】→ 点击当前 PHP 版本右侧【设置】
- 切换到【配置修改】,搜索
cgi.fix_pathinfo,确保值为1(即cgi.fix_pathinfo = 1) - 返回【服务】→ 找到该 PHP 版本 → 【重启】(不是重载,必须重启进程)
- 可临时建一个
info.php文件,输出$_SERVER['PATH_INFO'],访问/info.php/test/a/b看是否能拿到/test/a/b
校准根目录与 open_basedir 范围
宝塔默认把网站根目录设为项目根,但 TP6.1 推荐部署在 public/ 目录下。若根目录设错或 open_basedir 未覆盖 runtime/storage,PHP 连入口文件都读不到。
立即学习“PHP免费学习笔记(深入)”;
- 确认【网站】→ 站点【设置】→ 【根目录】指向的是
/www/wwwroot/your-site/public(不是项目根) - 进该 PHP 版本的【设置】→ 【防跨站攻击(open_basedir)】→ 关闭开关(最简见效法),或手动配置路径:
open_basedir=/www/wwwroot/your-site/public:/www/wwwroot/your-site/runtime:/www/wwwroot/your-site/storage:/tmp/:/proc/ - 用【文件】管理器开启“显示隐藏文件”,检查根目录下是否有
.user.ini;如有,打开确认其open_basedir=值与上面完全一致,大小写、末尾斜杠都不能错;不确定就直接删掉,宝塔会自动生成新的
验证 fastcgi_param SCRIPT_FILENAME 是否拼对
这是底层路径映射失败的根源。即使其他都对,这一行写错也会直接触发错误。
- 在站点【配置文件】中,定位到
location ~ \.php(.*)?$ { }区块 - 确认存在这行(且未被注释):
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 检查外层
server块或该 location 内是否定义了root;如果用了alias,则此处必须改为$request_filename或确保$document_root已被 alias 正确赋值 - 用命令行快速验证路径是否存在:
ls -l /www/wwwroot/your-site/public/index.php(路径必须真实存在且可读)



















