root必须指向public/目录,否则因vendor/autoload.php路径错误导致class 'think\app' not found且静默白屏;nginx的root若设为项目根目录,php将无法正确解析框架依赖路径,自动加载失败,页面空白。

ThinkPHP 8.0 迁移时,Nginx 的 root 必须指向 public/ 目录,否则直接白屏且无错误提示——这是 90% 迁移失败的根源。
为什么 root 指向项目根目录就白屏
ThinkPHP 8.0 的自动加载器(vendor/autoload.php)和框架核心类(如 think\App)全部基于 public/ 为当前工作目录解析路径。若 Nginx 的 root 设为 /var/www/myapp,PHP 执行 index.php 时会从该路径下找 vendor/autoload.php,但实际它在 /var/www/myapp/public/../vendor/autoload.php,导致 Fatal error: Class 'think\App' not found。错误常被静默吞掉,页面仅空白。
必须显式设置:
-
root /var/www/myapp/public;(Linux)或root D:/www/myapp/public;(Windows) - 末尾分号不能省,路径中不要有多余空格或反斜杠
- 改完后务必执行
nginx -t校验,再nginx -s reload
try_files 不能用 if (!-e $request_filename)
在 Windows 或某些 Nginx 版本下,if 块会导致 PATH_INFO 为空、$args 丢失、POST 数据截断——而 TP8 默认靠 PATH_INFO 解析路由,一空就静默失败。
正确写法是:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
注意三点:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
&是 HTML 实体,在 Nginx 配置里必须写成&,写成&会导致nginx -t报错 -
s=$uri对应 TP8 默认的pathinfo_fetch方式;若你改过配置(如设为['QUERY_STRING']),就得改成/index.php?$uri&$args - 该规则必须放在
location / { }块内,不能套在if或其他嵌套逻辑里
fastcgi_param SCRIPT_FILENAME 路径拼错就报 “Primary script unknown”
即使 try_files 转发成功,若 SCRIPT_FILENAME 拼出的不是 public/index.php 的绝对路径,PHP-FPM 就找不到入口文件,Nginx 错误日志只显示 Primary script unknown。
确保 location ~ \.php$ 块中包含这三行(顺序不重要,但缺一不可):
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
常见错误:
- 漏掉
PATH_INFO或PATH_TRANSLATED—— 导致路由解析失败 - 用
$request_filename替代$document_root$fastcgi_script_name—— Windows 下路径大小写/分隔符不一致时失效 - 没配
fastcgi_split_path_info正则(虽非强制,但建议加上):fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
宝塔面板里“运行目录”填错等于白配
宝塔新建站点默认把整个项目目录设为根目录,但 ThinkPHP 要求 Web 入口仅暴露 public/。若你在宝塔「网站设置 → 基本 → 运行目录」里留空或填了 /public,大概率已出问题。
正确操作:
- 「运行目录」填
/public(注意开头斜杠,不是public或./public) - 同时确认「网站目录」指向项目根目录(如
/www/wwwroot/myapp),而非/www/wwwroot/myapp/public—— 后者会让 Nginx 找不到index.php - 若用宝塔「一键部署」创建站点,它可能自动把
public当作根目录,此时需手动将项目整体移回上级目录,并修正运行目录,否则后续伪静态规则全部失效
最易被忽略的一点:改完运行目录后,宝塔不会自动重载 Nginx 配置,必须手动点「保存」并「重启」网站,否则配置不生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










