ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ThinkPHP中泛域名部署的实现方法

ThinkPHP中泛域名部署的实现方法 如何在ThinkPHP中实现泛域名部署站群对于需要部署多个网站的开发者来说站群架构是一种广泛采用的设计模式。而泛域名部署则是站群架构中比较常见的实现方式之一。在这篇文章中我们将介绍如何在ThinkPHP框架中实现泛域名部署站群。一、什么是泛域名部署泛域名部署是将一个域名下的所有子域名指向同一个文件夹或不同的文件夹。这样只需要一个主域名即可实现多个网站的部署大大简化了网站的管理和维护。例如我们有一个主域名为example.com现在需要部署三个子域名site1.example.com、site2.example.com和site3.example.com。若使用传统的部署方式需要为每个子域名单独配置一个虚拟主机并安装不同的网站应用程序。而使用泛域名部署则只需要将所有子域名指向同一个文件夹即可每个子域名内的网站应用程序可以共享同一套代码和数据。二、泛域名部署的实现方法配置DNS首先需要在DNS管理界面添加泛解析记录。在DNS解析列表中添加一条记录主机记录填写“*”记录类型填写“A”记录值填写网站服务器的IP地址。如图所示这个泛解析设置将所有子域名都指向了1.2.3.4这个IP地址。服务器配置在nginx或apache中需要将所有子域名指向同一个文件夹或不同的文件夹。以nginx为例打开nginx配置文件添加以下代码123456789101112131415161718192021222324server {listen 80;server_name .example.com;root /var/www/example/; //根路径index index.php index.html index.htm;location / {if ($request_uri ~* \/(.*)\/(.*)\/(.*)) {set $subdomain $1; //获取子域名}if ($subdomain) {//转发到指定子域名的文件夹rewrite ^(.*)$ /$subdomain$1 last;}//没有写子域名则转发到根路径if (!$subdomain) {rewrite ^(.*)$ /index.php last;}}}以上配置将所有请求按照子域名进行重写使得访问“site1.example.com”的请求实际上是访问 “/site1/” 文件夹下的内容。ThinkPHP配置在ThinkPHP中需要在config目录下的route.php文件中添加路由解析规则。例如在我们网站中有一个名为Blog的控制器那么我们可以这样设置路由解析规则12345usethink\Route;Route::domain(‘site1, ‘blog);//访问site1.example.com时转发到Blog控制器Route::domain(‘site2, ‘blog);//访问site2.example.com时转发到Blog控制器Route::domain(‘site3, ‘blog);//访问site3.example.com时转发到Blog控制器考虑到这里我们『泛域名部署站群』的本意我们可以使用正则表达式来替换上面的代码1234567891011121314usethink\Route;Route::pattern([subdomain\w,]);Route::domain(‘:subdomain.example.com,function($subdomain) {Route::group($subdomain,function() {Route::get(/,Index/index);Route::get(/test,Index/test);});});以上代码使用了一个正则表达式“\w”来匹配所有域名子串然后路由到同一个控制器。这样我们就可以在控制器中根据不同的子域名展现不同的页面。拓展Thinkphp 部署/域名部署域名部署ThinkPHP支持模块甚至可以包含控制器的完整域名、子域名和IP部署功能开启域名部署无论是子域名还是IP部署首先要在应用配置文件中开启APP_SUB_DOMAIN_DEPLOY这是前提然后配置域名部署规则APP_SUB_DOMAIN_RULES。1234567APP_SUB_DOMAIN_DEPLOY 1,// 开启子域名或者IP配置APP_SUB_DOMAIN_RULESarray(/* 域名部署配置*格式1: 子域名或泛域名或IP 模块名[/控制器名];*格式2: 子域名或泛域名或IP array(模块名[/控制器名],var1avar2bvar3*);*/)域名或者IP部署到模块并不需要设置模块访问列表。完整域名部署可以在域名规则中直接定义完整的域名例如12345APP_SUB_DOMAIN_DEPLOY 1,// 开启子域名配置APP_SUB_DOMAIN_RULESarray(admin.domain1.comAdmin,// admin.domain1.com域名指向Admin模块test.domain2.comTest,// test.domain2.com域名指向Test模块),在域名部署之前的访问地址http://www.domain.com/Admin/Index/index和http://www.domain.com/Test/Index/index域名部署后的访问地址变成http://admin.domain1.com/Index/index和http://test.domain2.com/Index/index子域名部署子域名部署包括任意级子域名的支持在你的应用配置文件中增加如下配置参数12345APP_SUB_DOMAIN_DEPLOY 1,// 开启子域名配置APP_SUB_DOMAIN_RULESarray(adminAdmin,// admin子域名指向Admin模块testTest,// test子域名指向Test模块),部署之前的访问地址http://www.domain.com/Admin/Index/index部署后的访问地址变成http://admin.domain.com/Index/index如果你的部署域名后缀是二级后缀例如com.cn、net.cn或者org.cn之类的话为了让系统更好的识别你的子域名需要配置APP_DOMAIN_SUFFIX如下1APP_DOMAIN_SUFFIXcom.cnAPP_DOMAIN_SUFFIX参数不支持设置多个后缀如果你是一级域名后缀的话则该参数可以无需任何设置。传入参数子域名部署的时候可以传入隐式的参数例如1234APP_SUB_DOMAIN_DEPLOY 1, // 开启子域名配置APP_SUB_DOMAIN_RULES array(admin array(Admin,var11var22), // admin子域名指向Admin模块),访问http://admin.domain.com/Index/index的同时会传入$_GET[var1] 1和$_GET[var2] 2两个参数。控制器绑定子域名部署还可以支持绑定某个控制器例如1234APP_SUB_DOMAIN_DEPLOY 1,// 开启子域名配置APP_SUB_DOMAIN_RULESarray(test.adminAdmin/Test,// test.admin子域名指向Admin模块的Test控制器),部署之前的访问地址http://www.domain.com/Admin/Test/index部署后的访问地址http://test.admin.domain.com/index如果要部署某个模块到泛域名支持可以使用123456APP_SUB_DOMAIN_DEPLOY 1, // 开启子域名配置APP_SUB_DOMAIN_RULES array(admin Admin, // admin域名指向Admin模块* array(Test,var11var2*), // 二级泛域名指向Test模块*.user array(User,status1name*), // 三级泛域名指向User模块),泛域名部署如果要部署某个模块到泛域名支持可以使用123456APP_SUB_DOMAIN_DEPLOY 1, // 开启子域名配置APP_SUB_DOMAIN_RULES array(admin Admin, // admin域名指向Admin模块* array(Test,var11var2*), // 二级泛域名指向Test模块*.user array(User,status1name*), // 三级泛域名指向User模块),配置后我们可以访问http://hello.domain.com/Index/index访问Test模块 并隐式传入$_GET[var1] 1和$_GET[var2] hello两个参数。访问如下地址访问如下地址http://think.user.domain.com/Index/index访问User模块并隐式传入$_GET[status] 1和$_GET[name] think两个参数。在配置传入参数的时候如果需要使用当前的泛域名作为参数可以直接设置为“*”即可。目前只支持二级域名和三级域名的泛域名部署。IP访问部署可以为某些模块配置IP访问规则例如1234APP_SUB_DOMAIN_DEPLOY 1, // 开启子域名配置APP_SUB_DOMAIN_RULES array(22.56.78.9 Admin, // 22.56.78.9指向Admin模块),总结本文介绍了如何在ThinkPHP框架中实现泛域名部署站群具体步骤涉及DNS、服务器和ThinkPHP的配置
返回列表