现在在网站中有这种情况,比如有一个 http://frontend.com/tv 需要根据判断用户的 User Agent ,如果用户是手机浏览器的话,则跳转到 http://mobile.com/tv。

  • frontend.com 所对应 frontend 应用
  • mobile.com 对应 mobile 应用

还有就是需要反过来的情况,比如用户在 PC 上访问 http://mobile.com/tv ,需要能自动跳到 http://frontend.com/tv

对于这种多域名的操作的话,大家是怎么处理的?

我这边现在是这样子的,建立了一个 MultipleAppUrlManager 的组件

这个组件配置方式如下:

return [
'components' => [
'urlManager' => [
'class' => 'common\components\MultipleAppUrlManager',
'apps' => [
'app-mobile' => [
'hostInfo' => 'http://mobile.com',
'baseUrl' => '',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
'frontend' => [
'hostInfo' => 'http://frontend.com',
'baseUrl' => '',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
],
],
],
];

组件源码:

<?php

namespace common\components;

use Yii;
use yii\web\UrlManager; class MultipleAppUrlManager extends \yii\web\UrlManager
{
public $apps = []; public function init()
{
if (isset($this->apps[Yii::$app->id])) {
$currentAppConfig = $this->apps[Yii::$app->id];
foreach ($currentAppConfig as $attribute => $value) {
$this->$attribute = $value;
}
} parent::init();
} /**
* @param array $params
* @param null $appId
* @return string
* @throws \yii\base\InvalidConfigException
*/
public function createUrl($params = [], $appId = null)
{
if ($appId === null || $appId === Yii::$app->id) {
return parent::createUrl($params);
} else {
if (!isset($this->apps[$appId])) {
throw new \yii\base\InvalidConfigException('Please configure UrlManager of apps "' . $appId . '".');
}
$appUrlManager = $this->_loadOtherAppInstance($appId); return $appUrlManager->createUrl($params);
}
} /**
* @param array|string $params
* @param null $scheme
* @param null $appId
* @return string
* @throws \yii\base\InvalidConfigException
*/
public function createAbsoluteUrl($params, $scheme = null, $appId = null)
{
if ($appId === null || $appId === Yii::$app->id) {
return parent::createAbsoluteUrl($params, $scheme);
} else {
if (!isset($this->apps[$appId])) {
throw new \yii\base\InvalidConfigException('Please configure UrlManager of apps "' . $appId . '".');
}
$appUrlManager = $this->_loadOtherAppInstance($appId); return $appUrlManager->createAbsoluteUrl($params);
}
} private $_appInstances = []; /**
* @param string $appId
* @return UrlManager
* @throws \yii\base\InvalidConfigException
*/
private function _loadOtherAppInstance($appId)
{
if (!isset($this->_appInstances[$appId])) {
$this->_appInstances[$appId] = Yii::createObject([
'class' => '\yii\web\UrlManager',
] + $this->apps[$appId]);
} return $this->_appInstances[$appId];
} public function getHostInfo($appId = null)
{
if ($appId === null || $appId === Yii::$app->id) {
return parent::getHostInfo();
} else {
$appUrlManager = $this->_loadOtherAppInstance($appId); return $appUrlManager->getHostInfo();
}
}
}

现在如果要跳转的话是这样写的:

# mobile tv absolute url
return Yii::$app->getUrlManager()->createAbsoluteUrl('tv', null, 'app-mobile'); # frontend tv absolute url
return Yii::$app->getUrlManager()->createAbsoluteUrl('tv', null, 'frontend');

来源:http://www.getyii.com/topic/214

Yii2 高级模板 多域名管理问题的更多相关文章

  1. Yii2 高级模板不使用Apache配置目录,将前后台入口移到根目录

    刚刚入手Yii2高级模板不久,部署项目时,得部署2个应用,个人感觉很繁琐,就将前后台入口文件全部拿到项目根目录.但是一看,完了,出错了!找教程找不到,还是自己解决吧 为了以后好升级,不改变Yii2核心 ...

  2. yii2高级模板使用一个域名管理前后台

    yii2的高级模板分为backend和frontend,最开始用yii的时候并没怎么在意,就使用了两个域名分别解析前后台.今天无意间看见 可以使用一个域名指向前后台. 1.修改 advanced/ba ...

  3. Yii2高级模板vendor和application非同级目录部署

    上面是Yii2的高级模板,当我们有多个application的时候,这种高级模板可以可以提供很好的扩展性,多个application共用一份YII2框架,默认情况下,框架和application是在同 ...

  4. 【备忘录】yii2高级模板多个应用启用同一个域名多个栏目

    nginx部署方式,两种写法,本人认为第一种写法没有第二种写法优雅 第一种写法配置文件: server { listen ; server_name youban-dev.jqtest.mopon.c ...

  5. Yii2高级模板的安装

    1.通过composer 安装高级版 C:wampwwwyii>composer create-project --prefer-dist yiisoft/yii2-app-advanced a ...

  6. yii2高级模板安装

    通过 Composer 安装 如果还没有安装 Composer,在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS https://getcomposer.org/insta ...

  7. 对于 yii2 高级模板 生成文件入口

    安装的 advanced 模板web下是没有index.php 方法: 在advanced 目录下有个init.bat 应用程序  双击即可如下 查看advanced 目录 (刷新)如下 已有:

  8. Yii2 高级模板添加更多Application

    单独的前端和后端有时是不够的. 如果需要额外的应用程序,例如博客blog: 1.将frontend复制到blog,环境/ dev / frontend到environments / dev / blo ...

  9. yii2高级版账号密码问题

    yii2高级版默认后台没有密码,生成账号密码步骤: 1. CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` ...

随机推荐

  1. MyEclipse 2013安装后要做的几件事

    一.Myeclipse 2013修改字体 MyEclipse 2013是基于Eclipse3.7内核,但在Eclipse的Preferences-〉general-〉 Appearance->C ...

  2. Yarn源码分析之事件异步分发器AsyncDispatcher

    AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatch ...

  3. ORACLE函数之日期时间转换函数

     1.          TO_CHAR 语法:TO_CHAR(X [,format]) 说明:将X按format格式转换成字符串.X是一个日期或者数字.format是一个规定了X採用何种格式转换 ...

  4. Spring MVC3.0.5搭建全程

    http://aokunsang.iteye.com/blog/1279322 ——————————————————————————————————————————————————

  5. apache2+svn Cannot load modules/mod_dav_svn.so into server: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3

    按照svn里的readme文件安装配置apache2与svn后, 启动apache2服务的时候 出现下面的问题 Cannot load C:/Program Files/Apache Software ...

  6. 电脑出现“损坏的图像”窗口提示dll没有被指定在Windows上运行如何解决

    电脑中出现了无法运行应用程序的情况,弹出一个“***.exe - 损坏的图像”的窗口,上面提示“***.dll没有被指定在Windows上运行……”,如果我们遇到这样的问题,应该要如何解决呢? 1.我 ...

  7. windows cmd 命令

    dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间 set 显示当前所有的环境变量 find 文件名 查找某文件 ...

  8. Lucene建立索引搜索入门实例

                                第一部分:Lucene建立索引 Lucene建立索引主要有以下两步:第一步:建立索引器第二步:添加索引文件准备在f盘建立lucene文件夹,然后 ...

  9. tf.name_scope()和tf.variable_scope()

    https://blog.csdn.net/gqixf/article/details/80191918 https://blog.csdn.net/uestc_c2_403/article/deta ...

  10. The E-pang Palace(暴力几何)

    //暴力的几何题,问,n个点可以组成的矩形,不相交,可包含的情况下,最大的面积,还有就是边一定与 x y 轴平行,所以比较简单了 //暴力遍历对角线,搜出所有可能的矩形,然后二重循环所有矩形,判断一下 ...