域名路由

ThinkPHP支持完整域名、子域名和IP部署的路由和綁定功能,同時(shí)還可以起到簡化URL的作用。

要啟用域名部署路由功能,首先需要開啟:

'url_domain_deploy' =>  true

定義域名部署規(guī)則支持兩種方式:動(dòng)態(tài)注冊和配置定義。

動(dòng)態(tài)注冊

可以在應(yīng)用的公共文件或者配置文件中動(dòng)態(tài)注冊域名部署規(guī)則,例如:

// blog子域名綁定到blog模塊
Route::domain('blog','blog');
// 完整域名綁定到admin模塊
Route::domain('admin.thinkphp.cn','admin');
// IP綁定到admin模塊
Route::domain('114.23.4.5','admin');

blog子域名綁定后,URL訪問規(guī)則變成:

// 原來的URL訪問
http://www.thinkphp.cn/blog/article/read/id/5
// 綁定到blog子域名訪問
http://blog.thinkphp.cn/article/read/id/5

支持綁定的時(shí)候添加默認(rèn)參數(shù),例如:

// blog子域名綁定到blog模塊
Route::domain('blog','blog?var=thinkphp');

除了綁定到模塊之外,還隱式傳入了一個(gè)$_GET['var'] = 'thinkphp' 變量。

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

// blog子域名綁定到index模塊的blog控制器
Route::domain('blog','index/blog');

URL訪問地址變化為:

// 原來的URL訪問
http://www.thinkphp.cn/index/blog/read/id/5
// 綁定到blog子域名訪問
http://blog.thinkphp.cn/read/id/5

如果你的域名后綴比較特殊,例如是com.cn或者net.cn 之類的域名,需要配置:

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

泛域名部署

可以支持泛域名部署規(guī)則,例如:

// 綁定泛二級(jí)域名域名到book模塊
Route::domain('*','book?name=*');

下面的URL訪問都會(huì)直接訪問book模塊

http://hello.thinkphp.cn
http://quickstart.thinkphp.cn

并且可以直接通過$_GET['name']變量 獲取當(dāng)前的泛域名。

支持三級(jí)泛域名部署,例如:

// 綁定泛三級(jí)域名到user模塊
Route::domain('*.user','user?name=*');

如果我們訪問如下URL地址:

http://hello.user.thinkphp.cn

的同時(shí),除了會(huì)訪問user模塊之外,還會(huì)默認(rèn)傳入 $_GET['name'] = 'hello'

在配置傳入?yún)?shù)的時(shí)候,如果需要使用當(dāng)前的泛域名作為參數(shù),可以直接設(shè)置為“*”即可。

目前只支持二級(jí)域名和三級(jí)域名的泛域名部署。

配置定義方式

除了動(dòng)態(tài)注冊之外,還支持直接在路由配置文件中定義域名部署規(guī)則,例如:

return [
    '__domain__'=>[
        'blog'      => 'blog',
        // 泛域名規(guī)則建議在最后定義
        '*.user'    =>  'user',
        '*'         => 'book',
    ],
    // 下面是路由規(guī)則定義
]

域名綁定地址

前面我們看到的域名部署規(guī)則:

// blog子域名綁定到blog模塊
Route::domain('blog','blog');

其實(shí)是把域名綁定到模塊的方式,其實(shí)還有其他的綁定方式。

綁定到命名空間

// blog子域名綁定命名空間
Route::domain('blog','\app\blog\controller');

綁定到類

// blog子域名綁定到類
Route::domain('blog','@\app\blog\controller\Article');

綁定到閉包函數(shù)

如果需要,你也可以直接把域名綁定到一個(gè)閉包函數(shù),例如:

// blog子域名綁定閉包函數(shù)
Route::domain('blog',function(){
    echo 'hello';
    return ['bind'=>'module','module'=>'blog'];
});

域名綁定到閉包函數(shù)其實(shí)是一種劫持,可以在閉包函數(shù)里面動(dòng)態(tài)注冊其它的綁定機(jī)制或者注冊新的路由,例如:

Route::domain('www', function(){
    // 動(dòng)態(tài)注冊域名的路由規(guī)則
    Route::rule('new/:id', 'index/news/read');
    Route::rule(':user', 'index/user/info');
});

如果你不希望繼續(xù),可以直接在閉包函數(shù)里面中止執(zhí)行。

// blog子域名綁定到閉包函數(shù)
Route::domain('blog',function(){
    exit('hello');
});

綁定路由規(guī)則

可以把域名綁定到一系列指定的路由規(guī)則,例如:

Route::domain('blog',[
    // 動(dòng)態(tài)注冊域名的路由規(guī)則
    ':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
    ':name'=>'blog/read',
]);

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

return [
    '__domain__'=>[
        'blog'      => [
            // 動(dòng)態(tài)注冊域名的路由規(guī)則
            ':id' => ['blog/read',['method'=>'GET'],['id'=>'\d+']],
            ':name'=>'blog/read',
        ],
    ],
    // 下面是其它的路由規(guī)則定義
]

更詳細(xì)的綁定功能請參考路由綁定一章內(nèi)容。

文檔最后更新時(shí)間:2018-04-25 19:36:06

文檔
目錄

深色
模式

切換
寬度