多域名在yii中需nginx为每个域名配置独立server块并正确映射root路径,否则请求无法进入对应web入口;还需统一session cookie domain、动态设置hostinfo,并确保fastcgi_param server_name生效。

多域名在 Yii 中不是靠改 urlManager 或加模块就能跑通的——它本质是多个独立 HTTP 入口,必须由 Web 服务器(Nginx/Apache)先完成域名到物理目录的映射,Yii 才有机会执行。否则请求根本进不到 backend/web/index.php 或 frontend/web/index.php,后面全是空谈。
Nginx 必须为每个域名配独立 server 块
这是最常被跳过的硬性前提。Yii 高级模板里 frontend/web 和 backend/web 是两个完全分离的 Web 根目录,各自有独立的 index.php 入口。Nginx 不能只配一个 server 块然后靠 rewrite 把 admin.example.com 转成 /backend/xxx ——那样会触发 session 冲突、asset 发布路径错乱、CSRF token 失效等问题。
-
server_name www.example.com→root /path/to/project/frontend/web -
server_name admin.example.com→root /path/to/project/backend/web - 两个块都必须包含
try_files $uri $uri/ /index.php?$args,缺一不可 - 别在
frontend的配置里用location /admin去代理 backend ——这不是多域名,是路径嵌套,会破坏应用边界
子域名间共享登录状态要动 PHP 和 Yii 两层
仅改 Yii 的 user 配置不够,因为底层 session cookie 默认绑定到精确域名(如 www.example.com),admin.example.com 读不到它的 PHPSESSID。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- PHP 层:修改
php.ini中的session.cookie_domain = .example.com(注意开头的点) - Yii 层:
user组件中统一设置'stateKeyPrefix' => 'myapp',避免不同子域名下生成不同前缀的 session key - 如果用了
allowAutoLogin,确保所有站点共用同一个identityCookiedomain 和 path,例如:'domain' => '.example.com', 'path' => '/' - 不要依赖
common/config/main.php里的全局user配置——frontend和backend的config/web.php必须各自显式覆盖这些项
动态识别当前域名并调整 request/hostInfo
当你要在代码里生成绝对 URL(比如邮件中的重置链接)、或做子域名路由分发(如 api.example.com 走 API 模块)时,不能硬编码 hostInfo。Yii 默认从配置读取,不会自动感知 Host 请求头。
- 在
frontend/config/web.php或backend/config/web.php的components里重写request: 'request' => ['class' => 'yii\web\Request', 'enableCsrfValidation' => false, 'cookieValidationKey' => 'xxx'],- 更稳妥的做法是在
web/index.php开头手动设置:Yii::$app->request->hostInfo = 'https://' . $_SERVER['HTTP_HOST']; - 如果要用
urlManager生成跨子域名链接(比如从www生成api的 URL),得自己写逻辑判断$_SERVER['HTTP_HOST'],再调用createUrl()并拼接协议和 host
真正容易被忽略的是:Nginx 的 fastcgi_param SERVER_NAME $host 是否生效。有些精简版配置会漏掉这行,导致 Yii 的 Yii::$app->request->hostName 返回空或错误值,后续所有基于域名的逻辑都会断掉。每次改完 Nginx 配置,记得用 var_dump(Yii::$app->request->getHostName()); 实测一下。










