default_app 配置项必须写在 config/app.php 中,为字符串且与 app/ 下子目录名完全一致(区分大小写),仅影响路由分发起点,需配合 app_express(TP6)或 auto_multi_app(TP8)才能隐藏应用名并实现无前缀路径访问。

default_app 配置项必须写在 config/app.php 里
ThinkPHP 6/8 的 default_app 是一个全局应用级配置,只在 config/app.php 中生效,其他位置(如路由文件、中间件、控制器)设置无效。它决定当 URL 不带应用名时,框架默认进入哪个应用目录。
常见错误是把它写进 config/route.php 或试图用 config('app.default_app', 'admin') 动态覆盖——这不会改变入口路由分发逻辑,只是读取值而已。
- 必须是字符串,且值需与
app/下的子目录名完全一致(区分大小写),比如目录是app/admin,就写'default_app' => 'admin' - 若目录名含大写字母(如
app/Admin),配置也得写'Admin',否则会报错App not exists: Admin - TP6 默认值是
'index';TP8 同样沿用该约定,但新项目常改作'home'或'web'
default_app 和 app_express 一起用才真正隐藏应用名
只设 default_app 不够:访问 / 时能进默认应用,但访问 /user/login 仍会 404,因为框架默认不把无前缀路径自动映射到默认应用——除非开启快速访问模式。
必须同时配置:
'default_app' => 'admin'-
'app_express' => true(TP6)或'auto_multi_app' => true(TP8,app_express在 TP8 已废弃)
否则即使 default_app 设了,/ 路由仍可能落到空应用或触发 App not exists 错误。注意 TP8 文档中已移除 app_express,改用 auto_multi_app 控制多应用开关。
default_app 不等于默认 404 页面
很多人以为设了 default_app 就能自动处理所有未匹配路由,其实不是。default_app 只影响「路由分发起点」,不接管 404 逻辑。
要让根路径 / 或任意未定义路径返回默认应用的页面,还得额外做两件事:
- 在默认应用的路由文件(如
app/admin/router.php)里显式绑定根路由:Route::get('/', 'Index/index'); - 确保该应用下存在对应控制器和方法,且命名空间正确(例如
app\admin\controller\Index) - 若用多应用 + 域名绑定,
default_app会被domain_bind覆盖,此时它仅对未绑定域名的请求生效
TP6 和 TP8 的 default_app 行为差异点
TP6 和 TP8 对 default_app 的底层处理基本一致,但启动流程有关键区别:
- TP6 要求手动安装
topthink/think-multi-app扩展才能启用多应用,否则default_app会被忽略(即使写了也不生效) - TP8 内置多应用支持,只要
auto_multi_app => true开启,default_app就立即起作用 - TP8 中若同时配置了
app_map(如'test' => 'admin'),则default_app仅对纯根路径/有效;/test/xxx会走映射,/xxx才走默认应用 - TP6 的
app_express开启后,/user/login会自动补全为/admin/user/login;TP8 的auto_multi_app默认不补全,需靠路由规则或中间件兜底
最易被忽略的是:无论 TP6 还是 TP8,修改 default_app 后都必须清缓存,执行 php think route:clear 和 php think config:clear,否则旧配置仍驻留在 runtime/cache/ 下。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











