beyondhjjyt

ThinkPHP支持分组的二级域名部署,该功能可以使项目中的多个分组呈现为二级域名的形式,例如经过配置二级域名部署,可以把:
http://domain.com/index.php/Admin/或者http://domain.com/Admin/
变为 http://admin.domain.com/ 访问方式。
先配置域名, 以 apache为例 , 配置如下: #主域名


  1.     DocumentRoot  D:\htdocs\www     ServerName domain.com


#子域名

  1.     DocumentRoot  D:\htdocs\www     ServerName admin.domain.com


然后配置host, 以windows为例编辑C:\WINDOWS\system32\drivers\etc\hosts
 文件,增加下面两行:

  1. 127.0.0.1  domain.com   127.0.0.1  admin.domain.com


接下来修改程序的配置文件config.php如下

  1. \'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; }

    用上面这个函数替换后就能支持二级域名了,不过还有事情要做。在项目的配置文件(config.php)里面加上二级域名支持。

    return array( #\'配置项\'=>\'配置值\' \'DEBUG_MODE\' => true, \'URL_MODEL\' => 2,\'APP_LEVEL_DOMAIN_DEPLOY_ON\' => true, #标识打开二级域名支持 \'APP_LEVEL_DOMAINS\' =>array(\'sites\',\'seo\'), #例:如果是sites.ys250.com 那么将采用2级别域名的方式#\'URL_HTML_SUFFIX\'=>\'.html\', #\'URL_ROUTER_ON\' => true


    结果如:
    http://www.ys250.com/sites/ip (old)
    http://sites.ys250.com/ip (new)
    http://www.ys250.com/seo (old)
    http://seo.ys250.com (new)
    http://ips.ys250.com/ 让采用老的方式,因为ips没有开通二级支持支持,因此大家要开通自己的二级域名请设置APP_LEVEL_DOMAINS这个数组。




    暂时只支持二级域名的部署,更深层级的还在想使用GROUP分组形式好还是使用Router来进行检测。不喜欢废话,直接切入主题:

    修改ThinkPHP/Lib/Think/Util/Dispatcher.class.php

    找到parsePathInfo方法,修改为:

     

    1. private static function parsePathInfo()   
    2. {   
    3.     $pathInfo = array();   
    4.     if(C(\'URL_PATHINFO_MODEL\')==2){   
    5.         $paths = explode(C(\'URL_PATHINFO_DEPR\'),trim($_SERVER[\'PATH_INFO\'],\'/\'));   
    6.         if(C(\'APP_LEVEL_DOMAIN_DEPLOY_ON\')) {   
    7.             $pathInfo[C(\'VAR_MODULE\')] = ucfirst(array_shift(explode(\'.\',$_SERVER[\'HTTP_HOST\'])));   
    8.             $pathInfo[C(\'VAR_ACTION\')] = array_shift($paths);   
    9.         } else {   
    10.             $groupApp = C(\'APP_GROUP_LIST\');   
    11.             if ($groupApp) {   
    12.                 $arr = array_map(\'strtolower\',explode(\',\',$groupApp));   
    13.                 $pathInfo[C(\'VAR_GROUP\')] = in_array(strtolower($paths[0]),$arr)? array_shift($paths) : \'\';   
    14.             }   
    15.             $pathInfo[C(\'VAR_MODULE\')] = array_shift($paths);   
    16.             $pathInfo[C(\'VAR_ACTION\')] = array_shift($paths);   
    17.         }   
    18.         for($i = 0, $cnt = count($paths); $i < $cnt$i++){   
    19.             if(isset($paths[$i+1])) {   
    20.                 $pathInfo[$paths[$i]] = (string)$paths[++$i];   
    21.             }elseif($i==0) {   
    22.                 $pathInfo[$pathInfo[C(\'VAR_ACTION\')]] = (string)$paths[$i];   
    23.             }   
    24.         }   
    25.     }else {   
    26.         $res = preg_replace(\'@(/w+)\'.C(\'URL_PATHINFO_DEPR\').\'([^,//]+)@e\'\'$pathInfo[/\'//1/\']="//2";\'$_SERVER[\'PATH_INFO\']);   
    27.     }   
    28.     return $pathInfo;   
    29. }   

    在App/Conf/config.php中添加配置:
    \'APP_LEVEL_DOMAIN_DEPLOY_ON\' => true
    即可开启二级域名部署

    访问:level.domain.com/index.html
    Module为LevelAction
    Action为index

    访问:payment.domain.com/gateway.html
    Module为PaymentAction
    Action为gateway



    首先是在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.com
    127.0.0.1 te.bbs.com
    127.0.0.1 data.bbs.com
    127.0.0.1 test.blog.bbs.com
    127.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去解析了!




分类:

技术点:

相关文章: