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

 更新时间:2024年04月01日 10:15:44   作者:下雪的哈尔滨  
对于需要部署多个网站的开发者来说,站群架构是一种广泛采用的设计模式,而泛域名部署则是站群架构中比较常见的实现方式之一,在这篇文章中,我们将介绍如何在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配置文件,添加以下代码:

server {

	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的控制器,那么我们可以这样设置路由解析规则:

use think\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控制器

考虑到这里我们『泛域名部署站群』的本意,我们可以使用正则表达式来替换上面的代码:

use think\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

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名或者IP配置
'APP_SUB_DOMAIN_RULES'    =>    array( 
    /* 域名部署配置 
    *格式1: '子域名或泛域名或IP'=> '模块名[/控制器名]'; 
    *格式2: '子域名或泛域名或IP'=> array('模块名[/控制器名]','var1=a&var2=b&var3=*'); 
    */ 
)

域名或者IP部署到模块并不需要设置模块访问列表。

完整域名部署

可以在域名规则中直接定义完整的域名,例如:

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名配置
'APP_SUB_DOMAIN_RULES'    =>    array(   
    'admin.domain1.com'  => 'Admin',  // admin.domain1.com域名指向Admin模块
    'test.domain2.com'   => 'Test',  // 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

子域名部署

子域名部署包括任意级子域名的支持,在你的应用配置文件中增加如下配置参数:

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名配置
'APP_SUB_DOMAIN_RULES'    =>    array(   
    'admin'        => 'Admin',  // admin子域名指向Admin模块
    'test'         => 'Test',  // test子域名指向Test模块
),

部署之前的访问地址:http://www.domain.com/Admin/Index/index

部署后的访问地址变成: http://admin.domain.com/Index/index

如果你的部署域名后缀是二级后缀,例如 com.cn 、net.cn 或者 org.cn 之类的话,为了让系统更好的识别你的子域名,需要配置APP_DOMAIN_SUFFIX如下:

'APP_DOMAIN_SUFFIX'=>'com.cn'

APP_DOMAIN_SUFFIX参数不支持设置多个后缀,如果你是一级域名后缀的话则该参数可以无需任何设置。

传入参数

子域名部署的时候,可以传入隐式的参数,例如:

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名配置
'APP_SUB_DOMAIN_RULES'    =>    array(   
    'admin'        => array('Admin','var1=1&var2=2'),  // admin子域名指向Admin模块
),

访问 http://admin.domain.com/Index/index 的同时会传入 $_GET['var1'] = 1 和 $_GET['var2'] = 2 两个参数。

控制器绑定

子域名部署还可以支持绑定某个控制器,例如:

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名配置
'APP_SUB_DOMAIN_RULES'    =>    array(   
    'test.admin'   => 'Admin/Test',  // test.admin子域名指向Admin模块的Test控制器
),

部署之前的访问地址: http://www.domain.com/Admin/Test/index

部署后的访问地址: http://test.admin.domain.com/index

如果要部署某个模块到泛域名支持,可以使用:

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名配置
'APP_SUB_DOMAIN_RULES'    =>    array(   
    'admin'    =>    'Admin',  // admin域名指向Admin模块
    '*'        =>    array('Test','var1=1&var2=*'), // 二级泛域名指向Test模块
    '*.user'   =>    array('User','status=1&name=*'),  // 三级泛域名指向User模块
),

泛域名部署

如果要部署某个模块到泛域名支持,可以使用:

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名配置
'APP_SUB_DOMAIN_RULES'    =>    array(   
    'admin'    =>    'Admin',  // admin域名指向Admin模块
    '*'        =>    array('Test','var1=1&var2=*'), // 二级泛域名指向Test模块
    '*.user'   =>    array('User','status=1&name=*'),  // 三级泛域名指向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访问规则,例如:

'APP_SUB_DOMAIN_DEPLOY'   =>    1, // 开启子域名配置
'APP_SUB_DOMAIN_RULES'    =>    array(   
    '22.56.78.9'  => 'Admin',  // 22.56.78.9指向Admin模块
),

总结

本文介绍了如何在ThinkPHP框架中实现泛域名部署站群,具体步骤涉及DNS、服务器和ThinkPHP的配置。通过此种方式,可以轻松管理和维护多个网站,同时也可以实现多样化的功能扩展。希望本文能够帮助到有需要的朋友。

以上就是ThinkPHP中泛域名部署的实现方法的详细内容,更多关于ThinkPHP泛域名部署的资料请关注脚本之家其它相关文章!

相关文章

  • xajax写的留言本

    xajax写的留言本

    xajax写的留言本...
    2006-11-11
  • php实现只保留mysql中最新1000条记录

    php实现只保留mysql中最新1000条记录

    这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下。
    2015-06-06
  • PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号

    PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号

    一般空间商提供的服务器空间默认PHP 指令 magic_quotes_gpc是on的,也就是打开的。我们通常用stripslashes() 函数删除自动添加的反斜杠。
    2015-09-09
  • PHP二维数组矩形转置实例

    PHP二维数组矩形转置实例

    下面小编就为大家带来一篇PHP二维数组矩形转置实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • jQuery向下滚动即时加载内容实现的瀑布流效果

    jQuery向下滚动即时加载内容实现的瀑布流效果

    下拉滚动条或鼠标滚轮滚动到页面底部时, 动态即时加载新内容,通过本文给大家介绍jQuery向下滚动即时加载内容实现的瀑布流效果,感兴趣的朋友参考下
    2016-01-01
  • 记Laravel调用Gin接口调用formData上传文件的实现方法

    记Laravel调用Gin接口调用formData上传文件的实现方法

    这篇文章主要介绍了记Laravel调用Gin接口调用formData上传文件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • php jsonp单引号转义

    php jsonp单引号转义

    JSONP(JSON with Padding)是一个非官方的协议,他的实现方式大致就是:让客户端决定要回调的Javascript函数名,在第三方服务端将 JSON 数据拼装到回调函数名中,返回的就是参数为JSON数据的函数调用脚本,浏览器加载脚本并执行达到获取第三方数据的目的。
    2014-11-11
  • 通过源码解析Laravel的依赖注入

    通过源码解析Laravel的依赖注入

    这篇文章主要给大家介绍了如何通过源码解析Laravel的依赖注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • laravel csrf验证总结

    laravel csrf验证总结

    这篇文章主要介绍了laravel csrf验证总结,csrf是laravel表单提交和ajax请求为了安全设置的机制,有感兴趣的同学可以深入学习下
    2021-03-03
  • phpcmsv9.0任意文件上传漏洞解析

    phpcmsv9.0任意文件上传漏洞解析

    这篇文章主要介绍了phpcmsv9.0任意文件上传漏洞解析,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10

最新评论