Yii2高级模板前后端必须通过Web服务器配置不同端口或域名实现物理隔离,而非子路径;因二者是独立入口应用,共用子路径会导致session、cookie、CSRF及asset冲突。

Yii2高级模板本身不通过端口区分前后端,而是靠Web服务器虚拟主机配置实现物理隔离。所谓“配端口”,其实是为 frontend 和 backend 分别绑定不同监听端口(如 8080 和 8081),让它们成为两个独立的 HTTP 服务。
这比用子路径(如 /admin)更安全、更符合高级模板设计初衷,也能彻底避免 session、cookie、CSRF token 的交叉干扰。
前端和后台必须使用不同端口或域名,不能共用同一端口下的子路径
Yii2 高级模板的 frontend/web/index.php 和 backend/web/index.php 是两个完全独立的 Web 应用入口。它们各自加载自己的配置、路由、用户组件和会话策略。
若强行把 backend 放在 frontend 下(例如 http://localhost:8000/backend),会导致:
- 后台登录后前台自动登录(共享 user 组件和 cookie)
- 刷新页面丢失身份(session 路径冲突)
- asset 发布错乱、AJAX 请求跨域失败
所以正确做法是:让 Web 服务器为两者分别监听不同端口,并指向各自 web/ 目录。
Nginx 中为前后端配置不同端口(推荐)
在 nginx.conf 或站点配置文件中添加两个 server 块:
# 前端:监听 8080 端口
server {
listen 8080;
server_name localhost;
root /path/to/yii2-advanced/frontend/web;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 后台:监听 8081 端口
server {
listen 8081;
server_name localhost;
root /path/to/yii2-advanced/backend/web;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}✅ 修改后重载 Nginx:
sudo nginx -t && sudo nginx -s reload
然后访问:
- 前端:
http://localhost:8080 - 后台:
http://localhost:8081
Apache 中配置不同端口(可选)
编辑 httpd.conf 或虚拟主机配置,启用监听多个端口:
Listen 8080
Listen 8081
<VirtualHost *:8080>
DocumentRoot "/path/to/yii2-advanced/frontend/web"
ServerName localhost
<Directory "/path/to/yii2-advanced/frontend/web">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:8081>
DocumentRoot "/path/to/yii2-advanced/backend/web"
ServerName localhost
<Directory "/path/to/yii2-advanced/backend/web">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>✅ 重启 Apache:
sudo apachectl restart
关键检查项(避免白屏/404/登录失效)
- ✅
frontend/web/index.php和backend/web/index.php文件都存在且未被移动 - ✅ 两个入口文件第13行都是
(new yii\web\Application($config))->run();(不是 console\Application) - ✅
YII_ENV在两个入口文件里一致(如'dev'),否则配置加载错乱 - ✅ 数据库已建好,
common/config/main-local.php中db配置正确 - ✅ 已执行
./yii migrate,且后台有独立admin表(非共用user表) - ✅
backend/config/main.php中user.identityClass指向common\models\AdminModel,cookie.path设为/或/(若用端口隔离,可不设 path;若用子路径则必须设)
补充说明:为什么不用改 Yii2 内部端口?
Yii2 是 PHP 框架,不直接监听端口 —— 端口由 Web 服务器(Nginx/Apache)或 PHP 内置服务器控制。
你不能在 config/web.php 里写 "port" => 8081 这类配置,那无效。真正起作用的是 Web 服务器如何把请求分发给哪个 index.php。
如果只是本地开发临时测试,也可用 PHP 内置服务器(不推荐用于后台,因不支持多并发和静态资源优化):
# 启动前端(另开终端) php -S localhost:8080 -t frontend/web frontend/web/router.php # 启动后台(再开终端) php -S localhost:8081 -t backend/web backend/web/router.php
但注意:PHP 内置服务器不解析 .htaccess,也不支持 try_files,路由需靠 router.php 手动转发,仅适合快速验证。
实际部署时,端口方案适合开发与测试环境;生产环境更推荐不同域名(如 www.site.com + admin.site.com),安全性与可维护性更高。


















