yii2高级版的frontend和backend是两个完全独立的web应用,必须通过nginx/apache配置两个独立server块分别指向各自web目录,共享common仅限逻辑复用,运行时零状态共享。

Yii2高级版的 frontend 和 backend 不是子模块,而是两个完全独立的 Web 应用,各自拥有入口文件、配置、路由、用户组件和会话机制。它们必须分别启动、独立部署,不能共用同一端口或子路径。
为什么必须独立启动
两者物理隔离:
- 前端入口固定为
frontend/web/index.php,加载frontend/config/main.php,启动yii\web\Application实例 - 后台入口固定为
backend/web/index.php,加载backend/config/main.php,也启动独立的yii\web\Application实例 - 共用
common/目录仅用于模型、工具类等逻辑复用,运行时不共享任何状态(如 session、cookie、CSRF token) - 若强行合并(如把 backend 放在 frontend 下作
/admin路由),会导致登录态穿透、权限混淆、资源路径错乱
如何实现独立启动
核心是 Web 服务器(Nginx/Apache)为二者配置**两个独立的 server 块或虚拟主机**,而非靠 Yii 路由区分:
- Nginx 示例:frontend 对应
server_name example.com,root指向/path/to/project/frontend/web - 同理,backend 对应
server_name admin.example.com,root指向/path/to/project/backend/web - 每个 server 块中必须包含标准 PHP-FPM 配置,尤其
try_files $uri $uri/ /index.php?$args - 绝对不要用 rewrite 把
/backend请求转发给frontend/web/index.php
启动前关键检查项
避免常见失败:
- 确认
frontend/web/index.php第13行是(new yii\web\Application($config))->run();(不是 console 或其他 Application) - 检查
YII_ENV在两个入口文件中是否一致且正确(如defined('YII_ENV') or define('YII_ENV', 'dev');) - 确保数据库配置已写入
common/config/main-local.php,并已执行./yii migrate - 上传目录(如
uploads)、静态资源路径需按实际域名分别处理,不可依赖相对路径跨域访问
常见误区澄清
这些操作无效甚至危险:
- 只改
urlManager规则,不配 Web 服务器 —— 请求根本到不了 backend 的 index.php - 在 frontend 的 config 中 bootstrap backend —— backend 不是 frontend 的模块,会报类找不到
- 复制 backend/web/index.php 到项目根或 frontend 目录下 —— 自动加载失败,配置泄露风险高
- 用同一域名 + 子路径(如
example.com和example.com/backend)—— 会共享 cookie 域,破坏登录隔离











