因宝塔默认ThinkPHP伪静态仅适配单应用模式,多应用需剥离应用前缀(如/admin)并透传至index.php,否则Nginx直接404;须替换为两条rewrite规则,且启用app_multi、配置multi.php、规范路由与url生成。

为什么直接套用宝塔默认ThinkPHP伪静态规则会 404?
因为宝塔面板内置的 ThinkPHP 伪静态规则只适配单应用(app 目录直出)模式,而多应用模式下入口文件仍为 public/index.php,但 URL 中需携带应用名(如 /admin、/api),且路由解析依赖 APP_NAMESPACE 和 app/multi 配置。默认规则没处理「应用前缀」与「模块路由」的路径剥离,导致 Nginx 把 /admin/login 当作静态路径直接 404,根本没转发给 PHP。
必须修改的 Nginx 伪静态规则(含多应用前缀剥离)
在宝塔站点设置 → 「伪静态」中,**完全删除原有 ThinkPHP 规则**,替换为以下内容(注意:适用于 public 为根目录的部署):
if (!-e $request_filename) {
rewrite ^/([a-z0-9A-Z]+)/(.*)$ /index.php/$1/$2 last;
rewrite ^/(.*)$ /index.php/$1 last;
}
关键点说明:
-
rewrite ^/([a-z0-9A-Z]+)/(.*)$ /index.php/$1/$2 last;—— 匹配形如/admin/login的请求,把应用名(admin)和后续路径(login)一起传给index.php,TP6 多应用才能识别 - 第二行兜底匹配无应用前缀的请求(如首页
/或公共资源),避免漏转发 - 必须用
last而非break,否则 PATH_INFO 无法正确生成,url()生成链接会丢应用名 - 若应用名含下划线或中划线(如
user_api),需调整正则中的字符集,例如^/([a-z0-9A-Z_\-]+)/
ThinkPHP6 多应用模式下必须检查的配置项
光改伪静态不够,TP6 必须显式声明应用识别方式,否则即使请求进了 index.php,也会默认走 app 应用而非你期望的 admin:
立即学习“PHP免费学习笔记(深入)”;
- 确认
config/app.php中'app_multi' => true已开启 - 确保
app/multi.php存在且定义了合法应用名,例如:return ['admin', 'api', 'home']; - 每个应用目录(如
app/admin)下必须有route.php,且其中路由注册需带应用上下文,例如:Route::get('login', 'Index/login');(不能写成Route::get('admin/login', ...),那是错误的冗余写法) - 如果使用
url()生成地址,务必指定应用名参数:url('index/login', [], true, 'admin'),否则生成的是当前应用下的路径
常见 404 场景与快速定位方法
部署后仍 404?别急着重装,按顺序查这几处:
- 访问
http://yoursite.com/admin返回 404,但http://yoursite.com/index.php/admin可正常 —— 说明伪静态未生效,检查宝塔是否勾选「启用伪静态」且规则已保存,再确认 Nginx 配置文件里该站点块中是否真写入了你改的规则(路径通常为/www/server/panel/vhost/nginx/yoursite.conf) - 访问
/admin/login显示「找不到控制器」—— 检查app/admin/controller/Index.php是否存在,类名是否为Index(首字母大写),方法是否为login(小写),并确认命名空间是app\admin\controller - 所有路由都跳转到
app应用的首页 —— 很可能是app/multi.php未被加载,检查该文件是否在app/目录下,且返回数组格式正确(不能有空格、BOM、echo 输出) - 页面能打开但 CSS/JS 404 —— 确保静态资源放在
public/static/下,且 HTML 中引用路径以/static/开头(不要用__STATIC__/这类模板变量,它可能未解析)
多应用模式的核心不是“隐藏 index.php”,而是让 Nginx 把带应用前缀的路径原样透传给框架,再由 TP6 的多应用机制接管路由分发。任何试图在伪静态里重写掉应用名、或在 PHP 层手动截取 URI 的做法,都会破坏框架原生逻辑。



















