ThinkPHP支持分组的二级域名部署,该功能可以使项目中的多个分组呈现为二级域名的形式,例如经过配置二级域名部署,可以把:
http://domain.com/index.php/Admin/或者http://domain.com/Admin/
变为 http://admin.domain.com/ 访问方式。
先配置域名, 以 apache为例 , 配置如下: #主域名
-
DocumentRoot D:\htdocs\www ServerName domain.com
#子域名
-
DocumentRoot D:\htdocs\www ServerName admin.domain.com
然后配置host, 以windows为例编辑C:\WINDOWS\system32\drivers\etc\hosts 文件,增加下面两行:
-
127.0.0.1 domain.com 127.0.0.1 admin.domain.com
接下来修改程序的配置文件config.php如下
-
'APP_GROUP_LIST' => 'Home,Test,Admin', 'DEFAULT_GROUP' =>'Home', 'APP_SUB_DOMAIN_DEPLOY'=>1, // 开启子域名配置 /*子域名配置 *格式如: '子域名'=>array('分组名/[模块名]','var1=a&var2=b'); */ 'APP_SUB_DOMAIN_RULES'=>array( 'admin'=>array('Admin/'), // admin域名指向Admin分组 'test'=>array('Test/'), // test域名指向Test分组 ),
首先是在config.php文件中开启二级域名配置
'APP_SUB_DOMAIN_DEPLOY' => true
然后配置二级域名规则如下:
'APP_SUB_DOMAIN_RULES' => array( 'admin' => array('admin'), // 二级域名 'data' => array('data'), // 二级域名 'www' => array('home'),//前台域名 'html' => array('html'),//静态页面 'data' => array('data'),//静态页面 '*' => array('te','DDD=*'), // 二级泛域名 'top.admin' => array('admin/admin','var=1'), // 三级域名 '*.blog' => array('blog','ABD=445&USER=*'), // 三级泛域名 ),
接下来进行host配置,在本机测试的时候需要自己配置如:127.0.0.1 ddd.bbs.com127.0.0.1 te.bbs.com127.0.0.1 data.bbs.com127.0.0.1 test.blog.bbs.com127.0.0.1 tt.blog.bbs.com
最后配置apache
vhost配置我找到了一种最简便的方法如:<VirtualHost *:80> DocumentRoot "E:\wamp\www\bbbb" ServerName bbs.com ServerAlias *.bbs.com # 开通泛解析</VirtualHost>
项目配置请看项目里的config.php
注:vhost配置中的ServerAlias是域名别名的意思,用*号表示匹配所有的子域名到本域名下
后面的就交给thinkphp去解析了
在官方手册去查了下,没有具体说明怎么支持二级域名的方法,最后找到一个解决方案(修改thinkphp的parsePathInfo函数让其支持二级域名)。
# 修改的路径是: # ThinkPHP\Lib\Think\Util\Dispatcher.class.php private static functionparsePathInfo() { $pathInfo = array(); if(C('URL_PATHINFO_MODEL')==2){ $paths =explode(C('URL_PATHINFO_DEPR'),trim($_SERVER['PATH_INFO'],'/')); $APP_LEVEL_DOMAINS= false; $domain = array_shift(explode('.',$_SERVER['HTTP_HOST'])); if(in_array($domain, C('APP_LEVEL_DOMAINS'), true)){ $APP_LEVEL_DOMAINS = true; } if(C('APP_LEVEL_DOMAIN_DEPLOY_ON') && $APP_LEVEL_DOMAINS) { if(isset($paths[0]) &&strtolower($paths[0]) == strtolower($domain)){ array_shift ($paths); }$pathInfo[C('VAR_MODULE')] = ucfirst(array_shift(explode('.',$_SERVER['HTTP_HOST'])));$pathInfo[C('VAR_ACTION')] = array_shift($paths); } else { $groupApp =C('APP_GROUP_LIST'); if ($groupApp) { $arr =array_map('strtolower',explode(',',$groupApp)); $pathInfo[C('VAR_GROUP')] =in_array(strtolower($paths[0]),$arr) ? array_shift($paths) : ''; }$pathInfo[C('VAR_MODULE')] = array_shift($paths); $pathInfo[C('VAR_ACTION')] =array_shift($paths); } for($i = 0, $cnt = count($paths); $i < $cnt; $i++){if(isset($paths[$i+1])) { $pathInfo[$paths[$i]] = (string)$paths[++$i]; }elseif($i==0){ $pathInfo[$pathInfo[C('VAR_ACTION')]] = (string)$paths[$i]; } } }else { $res =preg_replace('@(\w+)'.C('URL_PATHINFO_DEPR').'([^,\/]+)@e','$pathInfo[\'\\1\']="\\2";', $_SERVER['PATH_INFO']); } return $pathInfo; }