You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:24:00