CI框架本身没有“多站点”开关,多域名的本质是在Web服务器层用server_name分流、在应用层按$_SERVER['HTTP_HOST']切换base_url、数据库连接、路由规则和缓存前缀这几组配置。把这条链路打通,一套CI代码就能稳定服务多个域名,而且不用为每个站点复制一份框架内核。
CI框架多域名配置怎么做?先分清三种落地形态
很多人一上来就翻文档找“多域名配置项”,结果扑空,CI(CodeIgniter 3 和 4 都一样)设计上就是“一个入口跑一个应用”,多域名靠组合拳实现,业内常见的做法有三种,选哪种取决于业务耦合度。
一套代码、多个域名,运行时切换配置
适合各站点功能高度相似、只是数据源和品牌不同的场景,比如集团下几个区域站,核心是在入口或钩子里判断当前域名,然后决定加载哪套配置。
// application/config/config.php
$hostMap = [
'www.a.com' => 'a',
'www.b.com' => 'b',
];
$host = $_SERVER['HTTP_HOST'] ?? '';
$appKey = $hostMap[$host] ?? 'default';
$config['base_url'] = 'https://' . $host . '/';
$config['site_key'] = $appKey; // 自定义项,后续取用
注意:域名必须走白名单映射,绝对不能拿HTTP_HOST直接拼进SQL或文件路径,否则就是现成的Host头注入漏洞。
多个应用目录共享CI内核
适合站点差异大、需要独立控制器和视图的情况,目录可以这样组织:
system/放CI内核,全站共用一份apps/site_a/、apps/site_b/各自带controllers、views、config- 根目录放
index_a.php、index_b.php两个入口文件,分别指向不同的$application_folder
Nginx里把两个域名分别root到同一个站点目录,try_files指向各自的入口文件即可,升级CI版本时只改system/一处,维护成本明显低于复制多份代码。
CI只做API,域名分流交给Nginx
前后端分离项目里,CI往往只提供接口,这时多域名的活基本不用CI管,Nginx配置多个server块,把请求转到同一个php-fpm,跨域和域名校验在网关层处理就行。
多域名与单域名部署区别:什么时候该拆开
不是所有项目都值得上多域名,判断标准可以落到几个维度上:
| 维度 | 单域名 | 多域名 |
|---|---|---|
| 配置复杂度 | 一套config走天下 | 需要域名映射表与入口分流 |
| 数据隔离 | 同库同表,靠字段区分 | 常用独立库或表前缀 |
| Session与Cookie | 默认同域,省事 | 需显式设置cookie_domain |
| 静态资源CDN | 一个域名回源 | 每个域名单独回源或共用 |
| GEO权重 | 集中 | 分散,需各自积累 |
| 运维成本 | 低 | 证书、备案、监控都翻倍 |
行业共识认为,功能差异小于两成、用户群高度重叠的业务,拆多域名往往是给自己找活干;反过来,品牌独立、数据合规要求分开的项目,早拆早省心。
动手改配置:从 base_url 到缓存前缀
这一节是实操重点,几个必改项列清楚。
base_url 别写死成常量
CI3里$config['base_url']留空会自动推断,但自动推断在生产环境有风险,最好按上面的白名单映射赋值,CI4则是在app/Config/App.php里设置$baseURL,并善用$allowedHostnames数组来限定可信域名,数组之外的主机名会直接返回错误,这一层校验省了不少安全自查。
数据库连接按域名分组
CI3的application/config/database.php支持$db['group_name']多组配置:
$db['site_a'] = ['hostname' => ..., 'database' => 'db_a', ...]; $db['site_b'] = ['hostname' => ..., 'database' => 'db_b', ...];
调用时$this->load->database('site_a', TRUE)取对应连接,CI4把连接定义放进app/Config/Database.php的$defaultGroup和$tests这类分组里,同样支持运行时切换。
路由按域名分支
CI3可以在routes.php开头判断域名,再往下写不同规则;更规范的做法是用路由分组,把某个域名下的路由统一挂在一个前缀下,CI4的路由文件支持$routes->group()配合domain选项,直接声明“这条规则只对某个域名生效”,比手写if更清晰。
Session 和 Cookie 要显式隔离
多域名最容易踩的坑就是登录串号。$config['cookie_domain']如果统一写成.example.com,几个子域会共享登录态,看起来方便,实际可能造成越权,要么给每个站点独立的session保存路径(或Redis前缀),要么干脆用不同的一级域名彻底隔离。
缓存key加站点前缀
用文件缓存或Redis时,key的命名一定带上站点标识,比如site_a:home_banner,否则不同站点的缓存互相覆盖,排查起来非常痛苦。
本地开发环境多域名怎么配置?hosts 与 Web服务器两条路径
本地调试多域名,两步搞定。
第一步,改hosts。 Windows路径是C:\Windows\System32\drivers\etc\hosts,macOS和Linux是/etc/hosts,追加:
0.0.1 www.a.test
127.0.0.1 www.b.test
第二步,配虚拟主机。 Nginx示例:
server {
listen 80;
server_name www.a.test;
root /var/www/ci;
index index_a.php;
location / { try_files $uri $uri/ /index_a.php?$query_string; }
}
Apache则用VirtualHost加ServerName,同样是指向不同入口文件,配完记得nginx -t校验语法并重载,浏览器无痕窗口打开验证,别被DNS缓存坑了。
国内服务器多域名必须面对的备案与证书成本
这一块属于配置之外但绕不开的现实问题,国内服务器多域名备案,主体备案通常只覆盖一个网站,新增域名要做接入备案或新增网站备案,流程上比首次备案简单,但仍需时间,如果几个域名指向同一台服务器的同一套程序,备案信息里要把所有域名列全,否则解析到大陆机房可能被拦。
至于多域名HTTPS证书一年多少钱,差异很大:泛域名证书一张就能覆盖.example.com下所有子域,价格从几百到几千不等;如果是几个完全不同的一级域名,要么买多域名证书,要么每个域名单独申请,近年来免费证书普及度提升,单域名场景成本已压得很低,但泛域名免费证书仍然少见,预算有限时,按“一级域名数量×单域名证书”还是“一张泛域名证书”算一笔账,结论通常很清楚。
多域名管理里几个高频坑
- 硬编码域名:视图里写死
http://www.a.com/css/app.css,换域名全线崩,统一用base_url()或site_url()。 - CSRF token名冲突:多站点同域部署时,token名保持一致但cookie域重叠,会互相干扰。
- 上传目录混用:不同站点上传到同一个
uploads/,文件名如果没加前缀,覆盖是早晚的事。 - 日志不分家:所有域名日志写进同一个文件,出故障时定位成本陡增,按域名分目录写更实际。
- 环境配置漂移:
development和production两套配置靠手改,早晚出事,用环境变量或独立配置文件区分更稳。
CI框架多域名配置Q&A
CI框架多域名配置后,路由为什么会串到别的站点?
多半是入口文件没分流,或者base_url被缓存了,先确认Nginx的server_name是否真的指向不同入口,再检查是否有页面级缓存把A站的HTML输出给了B站,CI4还要看allowedHostnames是否漏配了新域名,漏配会直接报错而不是串站。
一套CI代码服务多个域名,性能会明显下降吗?
只要域名映射表放在内存或配置常量里,切换成本几乎可以忽略,它本质上就是几次数组查找,真正影响性能的是数据库连接数和缓存命中率,多站点共用Redis时建议按站点分库或分前缀,避免大key互相挤占。
多域名项目该用CI3还是CI4?
新项目直接上CI4,它对多域名场景的支持更完整,allowedHostnames、路由domain分组、环境变量配置都是开箱可用;CI3需要自己写钩子拼配置,能跑但长期维护吃力,老项目如果已经在CI3上稳定运行,没有强制升级理由时,先在配置层补齐白名单校验也能满足多域名管理需求。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/927816.html


评论列表(5条)
读了这篇文章,我深有感触。作者对一套的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是一套部分,给了我很多新的思路。感谢分享这么好的内容!
@学生ai149:读了这篇文章,我深有感触。作者对一套的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是一套部分,给了我很多新的思路。感谢分享这么好的内容!
读了这篇文章,我深有感触。作者对一套的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!