ThinkPHP5:多模板配置二级域名

现在很多项目都有PC端和移动端,PC和移动端都分别在不同模块,而“www”二级域名是直接访问PC端(index模块),如果想要访问移动端“www.域名.com/mobile”,这样域名就太长了,下面我教大家一个方法缩短域名。

准备

ThinkPHP支持完整域名、子域名和IP部署的路由和绑定功能,同时还可以起到简化URL的作用。

要启用域名部署路由功能,首先需要在config.php开启:

// 域名部署
'url_domain_deploy'      => true,

定义域名部署规则支持两种方式:动态注册和配置定义

动态注册

可以在应用的公共文件或者application\route.php动态注册域名部署规则,例如:

<?php
use think\Route;
Route::domain('m','mobile');

这样访问“m.域名.com”就可以直接访问mobile模板

支持绑定的时候添加默认参数,例如:

// m子域名绑定到mobile模块
Route::domain('m','mobile?var=thinkphp');

除了绑定到模块之外,还隐式传入了一个$_GET['var'] = 'thinkphp' 变量。

支持直接绑定到控制器,例如:

// m子域名绑定到mobile模块的index控制器
Route::domain('m','mobile/index');

如果你的域名后缀比较特殊,例如是com.cn或者net.cn 之类的域名,需要在config.php配置:

'url_domain_root'=>'thinkphp.com.cn'

配置定义方式

除了动态注册之外,还支持直接在application\route.php(路由配置文件)中定义域名部署规则,例如:

<?php
use think\Route;
Route::domain('mo','mo');
return [
    //域名绑定到模块
    '__domain__'  => [
        'api'   => 'api',
        'm'   => 'mobile',
        'www'   => 'index',
    ],
];

注意: 域名绑定到模块后,“www.域名.com”他会默认加上index模块,如果访问“www.域名.com/index”哪这个index不是模块而是控制器名称(因为默认加上index模块)

绑定路由规则

可以把域名绑定到一系列指定的路由规则,例如:

Route::domain('blog',[
    // 动态注册域名的路由规则
    ':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
    ':name'=>'blog/read',
]);

如果使用配置文件配置的话,可以按照下面的方式:

return [
    '__domain__'=>[
        'blog'      => [
            // 动态注册域名的路由规则
            ':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
            ':name'=>'blog/read',
        ],
    ],
    // 下面是其它的路由规则定义
]