现在在网站中有这种情况,比如有一个 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. c++ [wrong]simple "Garbage Collector"

    In fact, Ptr alone can accomplish the task mentioned below. Implementation see Ptr.h, main2.cpp. In ...

  2. 锂电池电流单位C5A

    C5A是一起的,是一个单位!C5A是描述一个电池本身容量标准中一个放电电流的单位,具体是直观意义是这电池在充满电状态下放电到2.75或者3V,用C5A这么大的电流,能放电5小时,那么C5A就代表的是这 ...

  3. 青蛙的约会 扩展欧几里得 方程ax+by=c的整数解 一个跑道长为周长为L米,两只青蛙初始位置为x,y;(x!=y,同时逆时针运动,每一次运动分别为m,n米;问第几次运动后相遇,即在同一位置。

    /** 题目:青蛙的约会 链接:https://vjudge.net/contest/154246#problem/R 题意:一个跑道长为周长为L米,两只青蛙初始位置为x,y:(x!=y,同时逆时针运 ...

  4. [Android]ListView & ViewPager & GridView 常见问题解决方法

    1. ViewPager左右滚动到两边时的渐变色,若想禁止,可以在布局文件中配置:android:overScrollMode="never" 2. ListView,GridVi ...

  5. OpenCV中Camshitf算法学习

    今天上午,结合OpenCV自带的camshitf例程,简单的对camshitf有了一个大致的认识和理解,现总结如下: 1:关于HSV H指hue(色相).S指saturation(饱和度).V指val ...

  6. php+redis秒杀

    啥都不说了,看代码 前台: 包括开始和结束的秒杀时间,倒计时插件,统一看一遍再去写代码,思路会更清晰. js文件引入一个.min.js和一个插件js(在下面,自己复制吧) // JavaScript ...

  7. 深入理解IEnumerable和IQueryable两接口的区别

    from:http://blog.csdn.net/ydm19891101/article/details/50969323 无论是在ado.net EF或者是在其他的Linq使用中,我们经常会碰到两 ...

  8. Android无线测试之—UiAutomator UiSelector API介绍之一

    一. UiSelector类介绍: 1) UiSelector类说明: UiSelector代表一种搜索条件,可以在当前界面上查询和获取特定元素的句柄,当找到多余一个的匹配元素,则返回布局层次结构上第 ...

  9. Olya and Energy Drinks(bfs)

    D. Olya and Energy Drinks time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  10. 1686 第K大区间(尺取+二分)

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...