必须把root指向public目录且location/中用try_files规则,这是thinkphp6/8在nginx运行的硬性前提;root错指项目根目录会导致class 'think\app' not found且静默白屏,try_files替代if可避免path_info为空引发的兼容问题。

必须把 root 指向项目的 public/ 目录,并在 location / 块中使用 try_files 规则——这两项是 ThinkPHP(尤其是 6/8 版本)在 Nginx 下正常运行的硬性前提,缺一不可。
root 必须指向 public 目录
ThinkPHP 6 和 8 的入口文件 index.php 已移入 public/ 子目录,框架内部自动加载路径(如 vendor/autoload.php)全部以该目录为基准。若 root 错误地指向项目根目录(如 /var/www/myapp),PHP 会因找不到 think\App 类而静默报错,页面直接空白,且无任何错误提示。
- 正确写法示例:
root /var/www/myapp/public;(Linux)或root D:/www/myapp/public;(Windows) - 路径末尾不加斜杠,结尾必须有分号
- 不要用符号链接代替真实路径,
$realpath_root依赖实际物理路径解析 autoload
location / 中必须用 try_files,禁用 if + rewrite
旧式 if (!-e $request_filename) { rewrite ... } 写法在 PHP 8.5+ 和 Windows 环境下极易导致 PATH_INFO 为空,引发白屏;Nginx 官方也明确将其列为反模式。ThinkPHP 6/8 默认走 QUERY_STRING 模式(即 s=xxx 参数由 $query_string 透传),不再强依赖 PATH_INFO。
- 标准规则:
location / { try_files $uri $uri/ /index.php?$query_string; } - 结尾必须是
/index.php?$query_string,不是/index.php/$1或/index.php?s=$1 - 删除配置中所有
if块,包括注释掉的,避免隐性干扰
PHP 处理块要配齐关键 fastcgi_param
仅靠 try_files 不够,PHP-FPM 接收请求时还需正确传递脚本路径和查询参数。ThinkPHP 8 强制依赖 $realpath_root 解析自动加载器,写成 $document_root 会导致类加载失败。
- 在
location ~ \.php$块中必须包含:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param QUERY_STRING $query_string;
-
$realpath_root是 Nginx 内置变量,会自动解析符号链接为真实路径,不能手动替换 - 确保 PHP 进程已启动并监听对应端口(如
127.0.0.1:9000),且info.php可正常访问
子目录部署需单独配置 location 前缀
如果站点访问地址是 https://example.com/myapp/,不能只改 location /,否则路由参数会被截断,s= 或自定义路由丢失。
- 保持主
location /不变(用于静态资源、跨子应用等) - 新增专用块:
location /myapp/ { try_files $uri $uri/ /myapp/index.php?$query_string; } - 此时
root应指向站点根目录(如/var/www/example.com),而/myapp/public/是其子路径 - 确保
/myapp/index.php文件真实存在,且权限可读
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











