ThinkPHP多应用伪静态失败主因是服务器转发路径与框架上下文未对齐:root必须指向/public目录,伪静态需两段正则捕获应用前缀(如/admin/login→s=admin/login),且fastcgi_param SCRIPT_FILENAME、PATH_INFO及PHP函数putenv/ini_set/scandir三者缺一不可;同时须定义APP_MULTI_MODULE常量、安装think-multi-app扩展并删除app/controller目录。

ThinkPHP多应用模式下伪静态配置失败,90%是因为服务器转发路径没对上框架的多应用上下文——不是规则写得不够多,而是root指向、重写逻辑、fastcgi参数三者没协同。单应用那套规则直接套用,必然404。
必须设对运行目录:root要指向/public
Nginx 的 root 必须明确设为项目根目录下的 public 目录,不是项目根目录,也不是 app 目录。例如:
- 正确:
root /www/wwwroot/myapp/public; - 错误:
root /www/wwwroot/myapp;(会导致 autoload.php 找不到,页面空白)
多应用本身不改变入口位置,所有应用共用 public/index.php,所以 root 只需配一次,且必须精准落在 public。
伪静态规则要捕获应用前缀
默认单应用规则 rewrite ^(.*)$ /index.php?s=$1 last; 在多应用下无效,因为框架收不到应用名。必须用两段式正则提取第一级路径:
立即学习“PHP免费学习笔记(深入)”;
if (!-e $request_filename) {rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /index.php?s=$1/$2 last;rewrite ^/(.*)$ /index.php?s=$1 last;}
这样访问 /admin/login 时,$_GET['s'] 就是 admin/login,框架才能识别出应用名为 admin。
PHP 和 FastCGI 参数不能漏
以下三项缺一不可:
-
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;(确保 PHP 知道执行哪个文件) -
fastcgi_param PATH_INFO $fastcgi_path_info;(TP6 默认走 PATHINFO 模式,需透传) - PHP 配置中必须启用
putenv、ini_set、scandir函数(宝塔面板 → PHP 设置 → 禁用函数里删掉它们)
漏掉 SCRIPT_FILENAME 会导致 Nginx 日志报 Primary script unknown;PATH_INFO 不透传,url_model=2 下路由无法解析。
多应用扩展和常量定义要提前
伪静态只是“路”,框架得先“认得清应用”。这两步必须完成:
- 在
public/index.php最开头(require autoload.php前)定义:define('APP_MULTI_MODULE', true); - 通过 Composer 安装扩展:
composer require topthink/think-multi-app,并确认版本是 6.x(非 8.x) - 删掉
app/controller目录(只要它存在,框架就强制降级为单应用)
没做这三步,再准的 Nginx 规则也白搭——请求根本到不了多应用分发逻辑。



















