ThinkPHP 8 在 Nginx 下路由 404 或空白页的主因是 root 未指向 public 目录、PATH_INFO 传递错误或 try_files 规则混用;须将 root 设为 /var/www/myapp/public,禁用 fastcgi_split_path_info,改用 try_files $uri $uri/ /index.php?$query_string,并确保 cgi.fix_pathinfo=0。

ThinkPHP 8 在 Nginx 下访问 /user/list 等路由时返回空白页或 404,不是代码写错了,而是 Nginx 没把路径信息正确传给 PHP,导致框架根本没启动路由解析——这问题在 Windows 和 Linux 上表现不同,但根源一致:入口路径错、PATH_INFO 空、或规则混用。
确认并修正 Web 根目录指向
ThinkPHP 8 强制要求 Nginx 的 root 必须精确指向项目 public/ 目录,而不是项目根目录。若 root 设为 /var/www/myapp,vendor/autoload.php 将因相对路径失效而无法加载,PHP 进程静默中断,页面即空白,且无错误日志输出。
打开站点配置文件(如 /etc/nginx/conf.d/myapp.conf),找到 server 块,将 root 行改为:
root /var/www/myapp/public;
立即学习“PHP免费学习笔记(深入)”;
注意末尾分号不能遗漏,路径中不能有多余空格或斜杠;Windows 用户请用正斜杠,例如 root D:/www/myapp/public;。
启用 PATH_INFO 传递(方法一:fastcgi_split_path_info)
该方式适用于 Nginx 1.10+,兼容性好,但 ThinkPHP 8.0 默认不依赖此方式——若你已开启 url_route_on 且未关闭 s= 参数兼容,则仍可使用;切勿与 try_files 混用,否则 $fastcgi_path_info 可能被覆盖为空。
在 location ~ [^/]\.php(/|$) { } 块内添加三行:
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
确保该块中已包含 include fastcgi_params; 或等效参数载入,并保留 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。
改用 try_files 隐藏入口(推荐 TP8 默认方案)
ThinkPHP 8 默认通过 $_SERVER['REQUEST_URI'] 解析路由,不再强依赖 PATH_INFO;此时最稳妥的方式是彻底绕过 PATH_INFO 提取逻辑,用 try_files 实现零干扰转发。
第一步:删除所有 if (!-e $request_filename) { rewrite ... } 块,它们在 TP8 下极易导致 $_SERVER['PATH_INFO'] 为空,引发静默失败。
第二步:在 location / { } 块中写入:
try_files $uri $uri/ /index.php?$query_string;
第三步:确保内部的 PHP 处理块(如 location ~ \.php$ { })中存在以下三行且顺序正确:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
注意:这里不设 PATH_INFO,也不调用 fastcgi_split_path_info——TP8 入口文件 public/index.php 会从 $request_uri 自动剥离 public/ 前缀并构造路由对象。
检查并禁用危险 PHP 配置
PHP 的 cgi.fix_pathinfo=1 是历史遗留漏洞项,它会让 Nginx 错误解析 .php.jpg 类恶意文件,同时干扰 PATH_INFO 提取逻辑。必须在 php.ini 中设为:
cgi.fix_pathinfo=0
同时检查 phpinfo() 页面,确认 putenv 和 ini_set 未被禁用——TP8 启动时需动态设置 APP_ENV 和 APP_DEBUG,禁用后会导致 public/index.php 执行中断,页面空白且无提示。
二级目录部署专用规则
若站点运行在 http://example.com/myapp/ 下,location / { } 完全无效,必须显式声明路径前缀并配合 alias 使用。
方法一(推荐):用 location /myapp/ { } + alias
location /myapp/ {
alias /var/www/myapp/public/;
try_files $uri $uri/ /myapp/index.php?$query_string;
}
方法二:用 location / { } + rewrite,但需在 index.php 前手动补全子目录前缀:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /myapp/index.php?s=$1 last;
}
}
注意:方法二仅当开启 url_router_on = true 且保留 s= 兼容模式时可用;若已切换至 REQUEST_URI 模式,请坚持用方法一,避免路径错位。



















