Stay hungry, Stay foolish

0%

[ThinkPHP2]二级域名部署的实现

二级域名的部署是tp3里的一个新特性。对于这个特性的好处我不多说。先来思考一下tp2下怎么来实现。

##在URL路由时截取二级域名

##把截取到的二级域名处理后交给分组变量

先来个简单的实现:

###准备工作

  • 修改hosts
1
127.0.0.1 tp2.com test.tp2.com
  • 添加apache的vhost

  • 在config里配置好分组,以及二级域名的开关

1
2
3
4
5
6
'APP_GROUP_LIST' => 'Home,Test',
'DEFAULT_GROUP' => 'Home',
'APP_SUB_DOMAIN_DEPLOY' => true,
'APP_SUB_DOMAIN_RULES'=>array(
'test'=> 'Test', // test域名指向Test分组
),
  • 对URL截取,取出二级域名对应的分组。

路由本身就是对URL的一种截取和重定向。所以我们要在URL路由判断之前取出二级域名。

1
2
3
4
5
6
7
8
9
10
11
12
if (C('APP_SUB_DOMAIN_DEPLOY')) {
$subDomain = strtolower(substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], '.')));
$_rules = C('APP_SUB_DOMAIN_RULES');
if ($subDomain && isset($_rules[$subDomain])) {
define('SUB_DOMAIN', $_rules[$subDomain]);
} else {
define('SUB_DOMAIN', 'Home');
}
}
//在$urlModel判断之前进行二级域名的处理
if($urlMode) {
}
  • 如果设置了URL_MODE,而当前URL格式不符合(如:用户手动输入),路由会对URL进行重写。这时如果开启了二级域名的部署,就需要隐藏分组名。
1
2
3
4
if (!C('APP_SUB_DOMAIN_DEPLOY')) {
$_URL .= $_GET[$_varGroup].($_GET[$_varGroup]?$_depr:'');
}
$_URL .= $_GET[$_varModule].$_depr.$_GET[$_varAction].$_depr;
  • 在其它的URL模式,都要对分组变量进行赋值,以便实例化的时候能找到它:
1
2
3
if (C('APP_SUB_DOMAIN_DEPLOY')) {
$_GET[C('VAR_GROUP')] = ucfirst($subDomain);
}

重写页面中的地址

有一点要注意的是:

在tp3里,如果模板里的链接没有用U函数动态生成的话,即使开启了子域名部署也无济于事。

放到tp2也一样,如果想在一个已经完成的项目里进行的话,有两种方法:

  • 把模板里的链接全部改一下,这个太不现实

  • 在tp的View层模板常量替换那一块动一动脑子

tp里的模板替换在View.class.php的templateContentReplace方法中。判断如果是二级域名部署开启的状态下,在$replace要替换的特殊变量表里加入如下:

1
2
'__APP__/Home/' => 'http://tp2.com/index.php/',
'__APP__/Test/' => 'http://test.tp2.com/index.php/',

这个要加在’__APP__‘ => __APP__ 之前,这样不会导致一些__APP__常量无法被正常替换。

收工?

其实还有一些工作,比如U方法的改写等,这里不一一给出。

据说打赏我的人,代码没有BUG