multiApp模式开启后入口文件必须为项目根目录下的index.php而非public/index.php;需配置APP_MULTI=true、Web服务器root指向项目根目录、Nginx传递PATH_INFO、手动创建app/multi/及子应用目录、严格命名并配置app/multi.php映射域名。

multiApp 模式开启后入口文件必须改用 index.php,不能用 public/index.php
ThinkPHP 6 的多应用模式(multiApp)默认关闭,开启后整个应用结构从单入口单应用变成「一个入口多个子应用」。但很多人卡在第一步:改了配置却 404。根本原因是——multiApp 模式下,框架不再通过 public/index.php 路由分发,而是要求所有请求统一走根目录下的 index.php(即与 app/、config/ 同级的那个),否则子应用无法被识别。
实操要点:
-
APP_MULTI必须设为true,且写在app.php或环境变量中(如.env中写APP_MULTI=true) - Web 服务器(Nginx/Apache)的 root 目录需指向项目根目录(不是
public/),否则子域名请求进不来 -
public/文件夹此时仅作静态资源托管用,index.php不再放里面
Nginx 子域名配置要绕过 public/ 并显式传递 PATH_INFO
子域名部署时,常见错误是直接复用单应用的 Nginx 配置,导致请求被重写到 public/index.php,而 multiApp 模式根本不认这个路径。必须让请求直抵根目录 index.php,并保留原始 PATH_INFO 供框架解析子应用名。
关键配置片段(Nginx):
server {
listen 80;
server_name admin.example.com;
root /path/to/your/project; # 指向项目根目录,不是 public/
index index.php;
<pre class="brush:php;toolbar:false;">location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info; # 必须传,否则子应用名解析失败
include fastcgi_params;
}}
注意:$fastcgi_path_info 在部分 Nginx 版本中需手动匹配,可加 fastcgi_split_path_info ^(.+?\.php)(/.*)$; 防止 PATH_INFO 为空。
app/multi 目录结构不自动创建,子应用命名必须小写且不含特殊字符
开启 multiApp 后,框架不会帮你建目录。你得手动在 app/ 下新建 multi/ 文件夹,并在里面按子域名建子应用目录,比如:
app/ ├── multi/ │ ├── admin/ # 对应 admin.example.com │ │ ├── controller/ │ │ └── config.php │ └── api/ # 对应 api.example.com │ └── controller/
这些子目录名就是应用标识符,会被框架用于路由分发。限制很硬:
- 目录名只能是小写字母 + 数字 + 下划线,不能有中划线(
-)、大写字母或中文 - 不能和
common、command等内置目录名冲突 - 每个子应用的
config/app.php中app_name值必须与目录名一致,否则启动报错Application not exists
子域名与应用绑定靠 app/multi.php 显式映射,不依赖 DNS 或 HTTP_HOST 自动推导
ThinkPHP 不会自动把 admin.example.com 映射到 admin 应用。你必须在 app/multi.php(该文件需手动创建)里写明映射关系:
return [
'admin.example.com' => 'admin',
'api.example.com' => 'api',
'example.com' => 'home', // 主站可指定默认应用
];
这个数组键是完整域名(含端口时需带端口),值是 app/multi/ 下的子目录名。漏写、拼错、大小写不一致都会导致 404 或进入默认应用。另外,开发时本地 hosts 绑定的 admin.test 也要写进这里,不能只写线上域名。
容易忽略的一点:如果用了 HTTPS,且 Nginx 做了 80 → 443 跳转,HTTP_HOST 可能被覆盖,建议在 multi.php 中同时写入 admin.example.com 和 www.admin.example.com,避免跳转后失配。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











