“No input file specified”根本原因是PHP-FPM未收到有效SCRIPT_FILENAME或PATH_INFO,需同步修正Nginx的fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name、删除或注释public目录下的.user.ini、并将宝塔防跨站白名单精确设为/public/路径且重启PHP服务。

“No input file specified”不是ThinkPHP框架本身的问题,而是Web服务器(Nginx)与PHP-FPM之间路径传递失败导致的。核心在于:PHP没收到有效的脚本文件路径(SCRIPT_FILENAME),或无法解析出正确的PATH_INFO。常见于宝塔面板部署ThinkPHP时开启伪静态后立即报错。
检查并修正Nginx的fastcgi_param SCRIPT_FILENAME
这是最常出错的一环。很多用户直接复制网上的配置,写成:
-
fastcgi_param SCRIPT_FILENAME $request_filename;—— ❌ 错误!$request_filename在某些场景下为空或指向错误位置 - 正确写法必须是:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;✅ - 该行需出现在
location ~ \.php(.*)$ { }块内,且不能被注释 - 改完后务必点击宝塔面板的「重载配置」,否则不生效
- 若项目依赖PATH_INFO(如
index.php/abc/def这类URL),还需补上:fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
清理public目录下的.user.ini
.user.ini是隐藏但高权限的PHP配置文件,常被忽略却极易引发问题:
- 它默认存在于ThinkPHP的
public/目录下,会强制覆盖open_basedir、pathinfo等关键设置 - 一旦其中禁用
pathinfo或路径范围不匹配,就会导致“No input file specified” - 解决方法:进宝塔文件管理器 → 打开
public目录 → 找到.user.ini→ 直接删除,或全选内容并在每行前加;注释掉 - 修改后必须重启对应PHP版本服务(软件商店 → PHP → 右侧「重启」)
宝塔防跨站白名单必须精确到/public/
ThinkPHP真正的Web入口是public/子目录,而非站点根目录。防跨站功能若只把根目录加入白名单,public/index.php仍会被隔离:
- 进入宝塔 → 网站 → 对应站点 → 「防跨站攻击(open_basedir)」→ 「设置」
- 白名单路径填完整绝对路径,结尾斜杠不可少,例如:
/www/wwwroot/myapp/public/ - 不能只填
/www/wwwroot/myapp/,否则PHP-FPM收不到有效路径,SCRIPT_FILENAME传空 - 保存后同样需重启PHP服务
确认伪静态规则兼容ThinkPHP版本
不同ThinkPHP版本对URL参数解析方式不同,伪静态规则不匹配也会触发该错误:
- TP6/TP8推荐Nginx规则:
try_files $uri $uri/ /index.php?$query_string;(保留GET参数) - 避免使用旧式
/index.php?s=写法,TP8已不兼容 - Apache用户注意:
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]在PHP 5.5+易出错,建议改为:RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] - 确保
public/为实际网站根目录(宝塔站点设置中「根目录」要指向public,不是项目根)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











