defaultroute 是 yii2 应用默认路由配置项,需在 config/web.php(或 frontend/config/main.php 等)的 $config 数组顶层添加,如 'defaultroute' => 'admin/dashboard',格式为 controller/action,不可含前后斜杠;修改框架源码 /vendor/.../application.php 不推荐。

defaultRoute 是 Yii2 控制应用入口的最直接配置项,改对位置就能生效,改错地方基本没用——它只在应用实例初始化时读取一次,且优先级高于控制器内 $defaultAction 或路由规则。
config/web.php 里配 defaultRoute 最稳妥
这是绝大多数项目实际使用的做法,不碰框架源码、不依赖模块层级、重启后立即生效。
- 打开
config/web.php,在$config = [ ... ]数组顶层(不是components里)添加:'defaultRoute' => 'admin/dashboard',
表示访问根路径(如/或/index.php)时,自动跳转到AdminController::actionDashboard() - 值格式必须是
controller/action形式,不能带斜杠前缀或后缀,比如'admin/dashboard'✅,'/admin/dashboard'❌,'admin/dashboard/'❌ - 如果只写控制器名(如
'admin'),会 fallback 到该控制器的$defaultAction(默认是'index'),等价于'admin/index' - 注意:这个配置对后台(
backend/config/main.php)和前台(frontend/config/main.php)要分别设置,basic 模板则统一在config/web.php
别去改 vendor/yiisoft/yii2/web/Application.php
虽然源码第 28 行确实写着 public $defaultRoute = 'site';,但硬改 vendor 文件等于埋雷:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 每次
composer update都会被覆盖,改了白改 - 团队协作时其他人拉代码就失效,排查成本高
- 升级 Yii2 版本可能因类结构变动导致 fatal error
- 除非你 fork 了框架并自行维护分支,否则这条路不通
为什么设置了 defaultRoute 还跳不到目标 action?
常见卡点不在配置本身,而在路由链路的其他环节:
-
urlManager的enablePrettyUrl关闭时,defaultRoute仍有效,但 URL 必须显式带?r=才能触发美化逻辑;而根路径请求(如 GET /)是否命中defaultRoute,取决于 Web 服务器是否把请求正确转发给了index.php - Apache 下确保
.htaccess存在且启用RewriteEngine on;Nginx 下必须有try_files $uri $uri/ /index.php?$args;,否则 404 根本进不了 Yii2,defaultRoute压根没机会执行 - 控制器文件名、类名、命名空间必须严格匹配。例如设了
'admin/dashboard',就要有controllers/AdminController.php,且类定义为class AdminController extends \yii\web\Controller - 若控制器继承自模块(比如
backend/modules/admin/controllers/DashboardController),那defaultRoute要写成'admin/dashboard/index'并确保模块已注册,否则路由解析失败返回 404
defaultRoute 和 urlManager 规则的关系
两者不冲突,但作用阶段不同:defaultRoute 解决“没指定路由时怎么办”,urlManager->rules 解决“指定了 URL 怎么映射”。
- 用户访问
/→defaultRoute生效 → 路由变成'admin/dashboard'→ 再走urlManager规则尝试美化生成链接(如/admin/dashboard) - 用户访问
/dashboard→urlManager规则匹配成功 → 映射为'admin/dashboard'→ 不经过defaultRoute - 所以即使你同时配置了
defaultRoute和urlManager规则,也不用担心覆盖问题;但若想让/和/dashboard都指向同一 action,就得靠urlManager的rules显式定义,defaultRoute只管前者










