yii2高级模板中frontend/config/main.php与backend/config/main.php完全独立,各自加载且不共享组件;需分别配置urlmanager、user(identityclass/identitycookie.name/path/idparam)、request.csrfcookie.path等,否则引发登录干扰或csrf失败。

frontend/config/main.php 和 backend/config/main.php 是两套完全独立的配置文件
Yii2 高级模板里没有“共用主配置”这回事。frontend 和 backend 各自加载自己的 main.php,彼此不继承、不覆盖、不共享组件实例。你改 frontend 的 urlManager 开启 URL 美化,对 backend 完全没影响;反之亦然。
常见错误是误以为改了 common/config/main.php 就能统一控制——它只被 init 脚本用于生成环境配置,运行时不参与加载。真正起效的只有两个应用目录下的 config/main.php。
-
frontend/config/main.php只在访问frontend/web/index.php时生效 -
backend/config/main.php只在访问backend/web/index.php时生效 - 两个文件中同名组件(如
user、request、session)必须分别配置,否则会混用或报错
user 组件必须各自指定 identityClass 和 identityCookie
前后台用户登录退出互相干扰,90% 出在这里。不能让 frontend 和 backend 共用同一个 user 组件配置,哪怕类名一样也不行。
关键参数必须差异化:
-
identityClass:frontend 用frontend\models\User或common\models\User,backend 必须用backend\models\AdminUser或common\models\Admin(不能复用同一模型类而不隔离) -
identityCookie.name:必须不同,例如_identity-frontendvs_identity-backend -
identityCookie.path:backend 建议设为/admin,frontend 保持/;否则 Cookie 会在两个域下互相覆盖 -
idParam:必须不同,例如__uservs__admin,否则 session ID 解析冲突
漏配任意一项,都可能导致前台登录后后台自动登录、或退出一个另一个也跟着登出。
request 和 csrfCookie 的 path 必须匹配入口路径
CSRF token 验证失败、AJAX 请求 400 错误,常因 request.csrfCookie.path 没对齐实际访问路径。
假设你用虚拟主机方式部署:
- frontend 访问地址是
https://site.test/→csrfCookie.path应为/ - backend 访问地址是
https://site.test/admin/→csrfCookie.path必须设为/admin
否则 backend 的表单提交会携带错 path 的 Cookie,服务端校验时找不到对应 token,直接拒绝请求。Nginx/Apache 配置里 location /admin 的 rewrite 规则也必须确保 SCRIPT_NAME 正确反映路径前缀,否则 $_SERVER['SCRIPT_NAME'] 仍为 /index.php,导致 Yii 内部 CSRF path 推导错误。
别名和路径相关配置不能硬编码,得靠 __DIR__ 向上跳
两个入口文件(frontend/web/index.php 和 backend/web/index.php)的物理位置不同,但都要加载 vendor/autoload.php 和 common 配置。它们都依赖相对路径定位:
require(__DIR__.'/../../vendor/autoload.php'); —— 这个 ../../ 是固定的,不能改成 ../../../vendor 或绝对路径。
所以你在 config/main.php 里写路径时,也要基于 web 目录为基准:
-
runtimePath应设为@app/../runtime,不是@root/runtime -
vendorPath保持默认即可(由Yii::getAlias('@vendor')自动解析) - 自定义别名如
@common、@frontend、@backend在各自main.php中必须单独设置,例如:Yii::setAlias('@frontend', dirname(__DIR__));
一旦把某个配置项写成绝对路径或跨层级错跳,比如在 backend 配置里误用 frontend 的别名,就会导致类加载失败、Class 'Yii' not found 或 assets 发布到错目录。











