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

Laravel子域配置:不同子域加载对应代码库与数据库方案

前置准备

不管实现哪种需求,先把泛域名解析配置完成:将*.example.test的A记录/AAAA记录指向你的服务器公网IP或负载均衡入口,避免后续新增子域时重复配置解析规则。


问题一:不同子域加载独立代码库与数据库

这个属于多站点独立部署场景,实现逻辑非常直接:

  • 用Web服务器(常用Nginx、Caddy)配置基于Host头的虚拟主机规则:
    • 匹配请求头为sub1.example.test的流量,将站点根目录指向sub1专属代码的部署路径,站点配置文件中直接写入sub1专属数据库的连接地址、账号、密码,对应运行时(PHP-FPM、Java进程、Node服务等)也可以做独立资源隔离;
    • 对sub2.example.test的请求重复上述逻辑,指向sub2自己的代码目录,配置独立的数据库连接信息。
  • 如果用容器化部署,直接给每个子域分配一套独立的服务栈(包含代码运行实例、对应数据库实例),入口网关按Host头做流量转发即可。
  • 方案特点:各子域的代码、资源、数据完全物理隔离,单点故障不会影响其他站点,适合子域数量少、不同客户定制化差异极高的场景;缺点是子域量级上来之后运维成本极高,代码更新需要逐站发布。

问题二:所有子域共用一套代码,按访问子域加载对应独立数据库

这是标准化SaaS产品最常用的租户物理隔离方案,实现步骤如下:

  • 所有子域的流量全部统一转发到同一套代码的服务入口,不需要为单个子域单独配置站点规则。
  • 在代码的全局请求前置中间件里做逻辑拦截:请求进入后第一时间获取请求的Host头,截掉主域后缀得到当前子域标识,比如访问sub1.example.test时拿到sub1作为当前租户的唯一标识。
  • 维护一份全局的租户-数据库映射关系,这份映射存在独立的公共配置库或者配置中心即可,不要硬编码在代码里。拿到当前请求的租户标识后,从映射表中查询对应的数据库连接信息,动态初始化该租户的数据库连接,将连接实例绑定到当前请求上下文,后续该请求的所有数据库操作全部走这个对应租户的连接即可。
  • 落地时注意几个避坑点:
    • 数据库连接池要按租户维度做隔离,不要混用不同租户的连接,避免出现串库的严重故障;
    • 增加租户合法性校验,如果当前访问的子域没有在映射表中找到对应配置,直接返回404或租户未开通的提示页,不要执行后续逻辑;
    • 存储映射关系的公共配置库只存租户标识和数据库连接元信息,不要存储业务数据,同时收窄该库的访问权限,避免出现安全问题影响全量租户;
    • 新增客户时只需要提前初始化好对应客户的独立数据库(表结构和公共代码的模型保持一致),在映射表中新增一条子域和数据库的对应关系即可,不需要重新发布代码,扩容效率很高。
  • 方案特点:代码版本统一,发版、运维成本极低,适合产品标准化程度高、客户量级大的场景,每个租户数据库独立,也满足数据物理隔离的合规要求。

内容的提问来源于stack exchange,提问作者Cristian25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:51:22