pure PHP实现multi-tenancy电商站 用户独立database与subdomain方案咨询
纯PHP多租户架构子域名分配解决方案
可用的纯PHP多租户相关包
- 数据库层的多租户支持可以用
tenancy/db-driver-mysql这类不依赖框架的独立组件,它可以帮你简化多数据库的连接切换逻辑,符合你纯PHP开发的技术栈要求。 - 目前没有可以直接实现子域名自动分配的纯PHP独立包,因为子域名分配能力高度依赖服务器和域名解析配置,和PHP代码的耦合度极低,需要你配合服务端规则自行实现。
子域名自动分配具体实现方案
1. 前置配置:泛域名解析
首先在你的域名解析服务商后台添加一条泛解析记录:将*.你的主域名.com全部指向你的服务器公网IP,这一步完成后所有子域名的请求都会统一打到你的站点服务器上,不需要每次新用户注册都单独新增解析记录。
2. Web服务器规则配置
以下是主流服务器的配置逻辑,作用是从请求头中提取子域名参数传递给PHP程序
- Nginx配置:在站点的server块中添加如下规则
server { listen 80; server_name ~^(?<subdomain>[a-z0-9-]+)\.你的主域名\.com$; root /var/www/你的项目目录; index index.php; location ~ \.php$ { fastcgi_pass unix:/run/php/你的php版本-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 将匹配到的子域名作为参数传入PHP fastcgi_param TENANT_SUBDOMAIN $subdomain; include fastcgi_params; } }
- Apache配置:在项目根目录的
.htaccess文件中添加重写规则
RewriteEngine On RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.你的主域名\.com$ [NC] RewriteRule ^(.*)$ index.php?subdomain=%1 [L,QSA]
3. PHP层租户识别逻辑
在项目全局入口文件中添加子域名校验和租户绑定逻辑即可:
<?php // Nginx配置取SERVER参数,Apache配置取GET参数 $subdomain = $_SERVER['TENANT_SUBDOMAIN'] ?? $_GET['subdomain'] ?? null; if (!$subdomain) { // 无子域名时走主站逻辑 require 'main_site.php'; exit; } // 校验当前子域名对应的租户是否存在,getTenantBySubdomain为你自己实现的总库查询方法 $tenant = getTenantBySubdomain($subdomain); if (!$tenant) { http_response_code(404); echo "当前租户不存在"; exit; } // 绑定租户对应的独立数据库,后续走租户专属站点逻辑即可 $tenantDb = connectToTenantDatabase($tenant['db_name'], $tenant['db_user'], $tenant['db_pwd']);
4. 注册阶段补充校验
你可以在用户注册环节提前加子域名合法性校验,避免后续出现异常:
- 禁止使用
www、admin、api、mail这类保留子域名 - 子域名仅允许包含小写字母、数字、横杠,长度控制在3-20位
- 子域名不能以横杠开头或结尾
内容的提问来源于stack exchange,提问作者Eslam Shaban
相关产品推荐
相关产品推荐

