codeigniter二级域名

codeigniter 3.1设置子域名解析

首先在application\config目录下增加一个domain.php文件,然后写入:

/*domain:允许访问的子域名
default_domain:www前缀默认进入的分组    
*/    
//默认分组

$default_domain = array('blog');

//全部分组    

$domain = array('blog','test','wechat');

查看system\core\CodeIgniter.php:

/* * ---------------- *  Instantiate the routing class and set the routing * ----------------- */    

$RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL);

可知codeigniter控制路由的程序是同目录下的Router.php;

打开Router.php,添加一个成员属性和一个成员方法,比如:

 /**     * 访问的域名前缀     *               
         * @var string    
   */    public $domain;    
// --------------------------------------------------------------------    
/**     * 设置domain     *   
        * @return  void     
*/    
protected function set_domain()    {        
$reqDomian = explode('.',$_SERVER['SERVER_NAME']);        
require_once(APPPATH.'config/domain.php');        
$this->domain = $reqDomian[0] == 'www' ? $default_domain[0] : $reqDomian[0];        
if(!in_array($this->domain,$domain)){            
show_404($RTR->directory.$class.'/'.$method);        
}    
}

然后把此文件内所有遍历controllers的路径都增加$this->domain.'/',例如:

if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php'))

改为

if ( ! file_exists(APPPATH.'controllers/'.$this->domain.'/'.$this->directory.ucfirst($class).'.php'))

返回system\core\CodeIgniter.php,把此文件内所有遍历controllers的路径都增加$RTR->domain.'/',例如:

APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'

改为

APPPATH.'controllers/'.$RTR->domain.'/'.$RTR->directory.$error_class.'.php'

OK,代码部分修改完毕。具体使用方式:

在application\controllers目录下建立分组,比如分index和admin;

application\config\domain.php文件里面的default_domain设置www前缀访问的分组,domain设置全部分组。

//默认分组$default_domain = array('blog'); //全部分组 $domain = array('blog','test','wechat');

bug:当不带域名前缀访问的时候会显示404页面;

解决方案:修改set_domain方法:

protected function set_domain()    {
        $reqDomian = explode('.',$_SERVER['SERVER_NAME']);
        if(count($reqDomian)<3)$reqDomian[0] = 'www';
        require_once(APPPATH.'config/domain.php');
        $this->domain = $reqDomian[0] == 'www' ? $default_domain[0] : $reqDomian[0];
        if(!in_array($this->domain,$domain)){            
            show_404($RTR->directory.$class.'/'.$method);        
         }    
}