关键是要让PHP-FPM精确拿到public/index.php的绝对路径:必须在location ~ .php$块中配置fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,root指令需指向public目录,并删除.public/.user.ini、宝塔防跨站白名单设为/public/且重启PHP服务。

要避免 Nginx 1.20 下 ThinkPHP 8.0 报 No input file specified,关键不是“加个规则”,而是让 PHP-FPM 精确拿到入口文件的绝对路径。这个路径必须指向 public/index.php,且不能依赖可能为空的变量(如 $request_filename)。
SCRIPT_FILENAME 必须用 $document_root 拼接
在 location ~ \.php$ { } 块中,必须写这一行,且不能注释、不能替换:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
⚠️ 错误写法(常见于复制粘贴):fastcgi_param SCRIPT_FILENAME $request_filename; —— Windows 或某些宝塔环境里,$request_filename 可能为空或指向错误路径,直接导致 PHP 找不到文件。
✅ 正确逻辑:$document_root 是你 Nginx 的 root 指令所设路径(比如 /var/www/myapp/public),$fastcgi_script_name 是请求的 PHP 文件名(如 /index.php),拼起来就是 /var/www/myapp/public/index.php —— 这才是 PHP 能加载的真实入口。
确保 root 指向 public 目录
如果 root 指向项目根目录(如 /var/www/myapp),那么 $document_root$fastcgi_script_name 就会变成 /var/www/myapp/index.php —— 但 TP8 的入口已移到 public/ 下,该路径根本不存在,必然报错。
- Nginx 配置中必须有:
root /var/www/myapp/public;(Linux)或root D:/www/myapp/public;(Windows) - 末尾分号不能漏,路径中不要有多余空格或反斜杠
补全 PATH_INFO 支持(TP8 路由必需)
ThinkPHP 8.0 默认使用 PATH_INFO 解析 URL(如 /user/list),若缺失或为空,框架无法提取路由参数,可能静默失败或 fallback 到默认页。
立即学习“PHP免费学习笔记(深入)”;
- 在同一个
location ~ \.php$块中,加上这两行: fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;- 建议同时加正则解析:
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
顺手清理干扰项
很多“No input file specified”是被隐藏配置拖垮的:
- 删掉或注释
public/目录下的.user.ini(它会强制覆盖 open_basedir 和 pathinfo 设置) - 宝塔用户:进「防跨站攻击」设置,白名单路径必须填完整且以
/结尾,例如:/var/www/myapp/public/ - 改完 Nginx 配置后,运行
nginx -t校验,再nginx -s reload;改完.user.ini或防跨站设置后,**必须重启 PHP 服务**,只重载 Nginx 不生效



















