No input file specified本质是Nginx未正确传递SCRIPT_FILENAME或PATH_INFO给PHP-FPM,需修正fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name、删除public下.user.ini、防跨站白名单设为/public/并重启PHP服务。

ThinkPHP 6.0 在 Nginx 1.20 下开启伪静态后报 No input file specified,本质不是框架问题,而是 Nginx 将请求转发给 PHP-FPM 时,没传对脚本路径(SCRIPT_FILENAME)或路由信息(PATH_INFO),导致 PHP-FPM 找不到要执行的文件。
确认并修正 fastcgi_param SCRIPT_FILENAME
这是最常出错的一环。Nginx 配置中必须确保 location ~ \.php(.*)$ { } 块内有且仅有一行正确的路径传递语句:
- ✅ 正确写法:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - ❌ 错误写法:
fastcgi_param SCRIPT_FILENAME $request_filename;($request_filename在伪静态下常为空或指向错误) - 该行不能被注释,也不能出现在其他 location 块里;必须在处理 PHP 的 location 块内部
- 改完后务必在宝塔面板点击「重载配置」,否则不生效
清理或禁用 public 目录下的 .user.ini
ThinkPHP 6 默认在 public/ 目录下自带 .user.ini,它会强制覆盖 PHP 的 open_basedir、pathinfo 等关键设置,极易引发此错误:
- 进宝塔文件管理器 → 打开项目根目录 → 进入
public/→ 找到.user.ini - 推荐直接删除;或打开编辑,在每行开头加
;注释掉全部内容 - 修改后必须重启对应 PHP 版本服务(软件商店 → PHP → 右侧「重启」)
宝塔防跨站白名单必须精确到 /public/
ThinkPHP 6 的 Web 入口是 public/ 子目录,而非整个项目根目录。若防跨站只加了根路径,public/index.php 仍会被隔离:
- 进入宝塔 → 网站 → 对应站点 → 「防跨站攻击(open_basedir)」→ 「设置」
- 白名单填完整绝对路径,结尾斜杠不可少,例如:
/www/wwwroot/myapp/public/ - 不能只填
/www/wwwroot/myapp/,否则 PHP-FPM 收不到有效路径 - 保存后同样需重启 PHP 服务
补充:启用 PATH_INFO 并检查伪静态规则
TP6 默认使用 PATH_INFO 模式(如 /index.php/user/login 或去掉 index.php 的纯路径),需确保底层支持:
- 进 PHP 管理 → 「配置修改」→ 找到
cgi.fix_pathinfo,设为1(即cgi.fix_pathinfo = 1)→ 保存并重启 PHP - Nginx 配置中,在
location / { }块内添加标准 TP6 规则:try_files $uri $uri/ /index.php?$query_string; - 确认网站根目录已设为
/www/wwwroot/myapp/public(推荐方式),或在 Nginx 中显式通过root指向该路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











