thinkphp 8 二级目录部署报 404 或白屏的根本原因是 nginx 未正确透传子目录路径,需同时满足:root 指向 public 目录、location 显式声明子目录前缀、try_files 补全 /myapp/index.php 入口路径。

二级目录部署的核心问题
ThinkPHP 8 在二级目录(如 https://example.com/myapp/)下报 404 或白屏,根本原因不是路由没写对,而是 Nginx 没把子目录路径正确透传给 PHP。框架依赖 $_SERVER['SCRIPT_NAME'] 和 $_SERVER['REQUEST_URI'] 推导入口位置,若这两项不含 /myapp/ 前缀,路由解析直接错位,Route not found 就成了必然结果。
必须匹配的三项配置
缺一不可,顺序不能颠倒:
-
root 必须指向子目录内的 public:例如项目放在
/var/www/html/myapp/,则 root 应为/var/www/html/myapp/public;写成项目根目录或漏掉/public,会导致 autoload 失败、静默白屏 -
location 块显式声明路径前缀:不能只写
location / { },必须写location /myapp/ { },否则 Nginx 不识别该请求属于子应用 -
try_files 最后一项补全子目录入口路径:用
/myapp/index.php?$query_string,而非/index.php?$query_string;确保物理文件路径与 URL 路径一致
Nginx 配置实操片段
以下为可直接复制粘贴的最小可用配置(替换 myapp 为你的真实子目录名):
location /myapp/ {
alias /var/www/html/myapp/public/;
try_files $uri $uri/ /myapp/index.php?$query_string;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php-fpm;
}
}
注意:alias 指令比 root 更适合子目录场景,它能准确映射 URL 路径到物理路径;$request_filename 可确保 SCRIPT_FILENAME 拼接无误,避免 $realpath_root 因符号链接引发的兼容问题。
配套框架检查项
服务器配置只是半程,ThinkPHP 内部也需确认:
-
config/app.php中'url_route_on' => true已开启 -
'pathinfo_depr' => '/'保持默认斜杠分隔,与 Nginx 规则中s=后的结构一致 - 禁用
if (!-e $request_filename)类旧规则——它在子目录下极易导致PATH_INFO为空,ThinkPHP 8 直接放弃解析 - 临时加一行调试代码到
public/index.php开头:var_dump($_SERVER['SCRIPT_NAME'], $_SERVER['REQUEST_URI']); die();,确认输出含/myapp/
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











