CodeIgniter二级域名配置的核心不是改框架底层,而是让多个子域名统一命中同一个入口文件,再按HTTP_HOST做路由分发,同时把session的cookie域设置成主域名。
codeigniter 二级域名怎么配置:从DNS到入口文件
先理清一条主线,二级域名本质上只是DNS指向同一个服务器,服务器再把请求交给同一个CI项目,CI框架本身不关心域名,它只认入口文件后面跟的控制器和方法,所以配置的关键是在服务器和入口层就做好统一处理。
具体操作路径如下:
- 在DNS解析后台添加子域名的A记录,例如
admin.example.com、m.example.com,IP指向主站服务器。 - 在服务器面板或Web服务器配置里,把这些子域名绑定到同一个站点根目录。
- 保持CodeIgniter入口文件
index.php不改写应用目录,让所有子域名都走同一个application。 - 在
application/config/config.php里不要写死base_url,留空或动态生成。 - 本地测试时修改系统
hosts文件,把子域名指向0.0.1。
本地开发环境怎么配置codeigniter二级域名同样遵循这个逻辑,Windows打开C:WindowsSystem32driversetchosts,加入两行:
0.0.1 www.example.test
127.0.0.1 admin.example.test
macOS和Linux修改/etc/hosts即可,浏览器访问admin.example.test就会进入本地CI项目。
国内服务器二级域名备案要求
如果服务器放在国内机房,子域名也要完成备案接入,已备案的主域名增加子域名解析时,一般只需要在接入商后台新增域名绑定,不用重新走完整备案流程,但未备案的子域名直接绑定到国内服务器,多数情况下会被机房拦截,海外服务器则没有这个限制。
codeigniter 二级域名路由重写:让不同子域名走不同模块
二级域名配置好后,还有一个问题:如何让不同的子域名加载不同的控制器目录?原生CI路由规则基于URI段,不读取主机名,所以要做主机名路由,必须扩展核心Router类。
在application/core/MY_Router.php里写:
class MY_Router extends CI_Router { public function __construct() { parent::__construct(); $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; if (strpos($host, 'admin.') === 0) { $this->directory = 'admin/'; } elseif (strpos($host, 'm.') === 0) { $this->directory = 'mobile/'; } } }
这样,访问admin.example.com会自动在application/controllers/admin/下找控制器,访问m.example.com则进入application/controllers/mobile/。
多站点目录结构设计
推荐把子模块控制器放在独立目录下,公共模型和库仍然共享:
application/
controllers/
admin/
Dashboard.php
mobile/
Home.php
models/
libraries/
这种结构的好处是公共代码不用复制,多个子域名共用一个models目录和libraries目录,维护成本低很多,子站点的业务逻辑只存在各自控制器目录里。
codeigniter 多站点二级域名对比:单入口还是多入口?
实际项目里,二级域名部署有三种主流方案,没有绝对好坏,要按团队规模和业务隔离需求选择。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 单入口+主机名路由 | 共享核心、统一维护 | 路由逻辑需要自行扩展 | 中小型多模块项目 |
| 多入口+多应用目录 | 子站隔离彻底、互不影响 | 公共代码重复、升级麻烦 | 独立子系统并行开发 |
| 多站点独立部署 | 目录权限和资源完全分开 | 服务器资源占用高 | 大型系统或团队分离 |
行业共识认为,多数中小项目优先选单入口加主机名路由,运维成本更低,扩展也不复杂,只有子站业务差异极大、技术栈可能变化时,才考虑多应用或多站点独立部署。
codeigniter 二级域名共享session怎么处理
多子域名项目经常需要一处登录、处处可用,这里的主要障碍不是CI本身,而是浏览器cookie的域机制。
打开application/config/config.php,重点改三项:
$config['cookie_domain'] = '.example.com';
$config['cookie_prefix'] = 'ci_';
$config['cookie_secure'] = TRUE;
cookie_domain前面的点不能少,少了点,浏览器只把cookie发给当前子域名,业内专家指出,跨子域名共享登录态失败,大多数情况是cookie_domain漏了开头的点,这里也建议生产环境强制HTTPS,并把cookie_secure设为TRUE。
数据库session与加密密钥
如果session驱动用的数据库,还要保证所有子域名站点连接同一个session表和同一个加密密钥:
$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions';
$config['encryption_key'] = 'same-key-for-all-sites';
加密密钥不一致,即使cookie带过去了,服务端也解不出session数据,session表结构按CI默认建表即可,所有子站点共用一张ci_sessions表。
本地开发环境怎么配置codeigniter二级域名
本地环境首选phpstudy、XAMPP或MAMP这类集成面板,以phpstudy为例:
- 在“网站”里新建站点,域名填写主域名和子域名,例如
example.test和admin.example.test。 - 根目录指向CI项目入口文件所在目录。
- 修改
hosts文件,把两个域名都指向0.0.1。 - 重启Apache或Nginx,清除浏览器DNS缓存。
线上部署时,Nginx的server_name要列出全部子域名:
server {
listen 80;
server_name example.com www.example.com admin.example.com m.example.com;
root /var/www/ci-project;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
Apache则用ServerAlias把多个子域名指向同一虚拟主机,再配合.htaccess伪静态即可。
codeigniter 二级域名部署常见问题排查
静态资源路径错乱
子域名下图片、CSS、JS路径混乱,多数原因是base_url写死成了主域名,不要写死,改成动态:
$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . '/';
视图里再用base_url()函数输出路径,可以避免子域名变化带来的资源404。
CSRF令牌跨子域名失效
如果表单从一个子域名提交到另一个子域名,CI的CSRF保护会因为cookie域不一致报错,先确保
cookie_domain设置了主域名,再调整:
$config['csrf_protection'] = TRUE;
$config['csrf_regenerate'] = FALSE;
表单页和提交处理页的子域名可以不同,但必须在同一个主域名下,跨主域名提交表单则不在常规CI配置范围内,需要额外接口处理。
伪静态在Apache下的写法
站点根目录.htaccess写入:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.)$ index.php/$1 [L]
多子域名共用这一份.htaccess即可,不需要为每个二级域名单独写规则,只要服务器把子域名指到同一目录,这条规则对所有子域名生效。
CodeIgniter二级域名的落地难度不在框架本身,而在主机名识别、入口统一和cookie域三件事是否同步到位,把这三处理顺,多子域名项目就能用同一套核心稳定跑起来。
CodeIgniter 二级域名能用同一个控制器吗?
可以,二级域名只是访问入口不同,最终加载哪个控制器由路由和目录规则决定,多个子域名完全可以映射到同一个控制器和方法,只需在扩展Router类时不改变默认directory,或者在routes.php中配合自定义逻辑,原生routes.php无法直接读取HTTP_HOST,所以条件判断要放在MY_Router里完成。
codeigniter 二级域名 cookie 带端口怎么处理?
本地开发时,子域名如果带不同端口,如8080和8081,cookie默认不区分端口,只要两个站点的域名解析到同一个主域名,并且cookie_domain设置为.example.test,端口不同不影响cookie共享,浏览器按域名和路径隔离cookie,不按端口隔离,生产环境建议统一80或443端口,避免HTTPS跳转带来额外排查成本。
CodeIgniter 二级域名伪静态在Apache怎么配置?
在站点根目录的.htaccess中写入:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.)$ index.php/$1 [L]
多子域名共用一套.htaccess即可,无需为每个二级域名单独配置,Apache通过ServerAlias把子域名指向同一虚拟主机后,该规则对所有子域名生效。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/663409.html





