CodeIgniter 原生路由不支持子域名路由,因其仅匹配 URI 路径,不解析 Host 头;可行方案包括 Web 服务器分流、入口文件预处理或 CI4 中间件拦截。

CodeIgniter 原生路由系统(无论是 CI3 的 $route 数组,还是 CI4 的 $routes->get() 等方法)**不直接支持基于子域名或 Host 头的路由分发**。它的路由匹配仅作用于 URI 路径部分(如 /news/123),不解析或判断请求来自 admin.example.com 还是 api.example.com。
为什么不能在 routes.php 里写子域名条件
因为路由文件执行时,HTTP 请求头(包括 Host)尚未被框架用于路由决策;CI 的路由层只接收已解析的 URI 字符串。你无法在 $route['...'] = '...'; 或 $routes->get(...) 中嵌入 PHP 条件判断 Host —— 那些语句只是静态定义,不是运行时逻辑分支。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
真正可行的替代方案
要实现“不同子域名走不同控制器或逻辑”,必须在更早的请求入口或 Web 服务器层介入:
-
Web 服务器配置分流(推荐):在 Apache 或 Nginx 中根据
Host头将请求代理到不同入口或路径。例如:
– Nginx 中用server_name api.example.com;块,把所有请求重写为/index.php/api/...,再由 CI 路由处理api/开头的路径;
– Apache 可用VirtualHost+RewriteCond %{HTTP_HOST}实现类似效果。 -
在 index.php 入口手动预处理:修改项目根目录(CI3)或
public/index.php(CI4)文件,在加载框架前读取$_SERVER['HTTP_HOST'],动态设置一个全局标识(如define('SUBDOMAIN', 'admin')),然后在控制器中判断该常量来切换逻辑。这不是“路由限制”,但能达成按子域区分行为的目的。 -
CI4 中使用中间件(Middleware)拦截:在
app/Config/Middleware.php中注册一个高优先级中间件,检查$request->getHeaderLine('Host'),若不匹配预期子域,直接返回 403 或重定向。这属于访问控制,不是路由映射,但可有效“限制”非授权子域的请求进入业务层。
注意两个常见误区
去掉 index.php 不等于支持子域名路由:.htaccess 或 Nginx 的 try_files 只解决路径重写问题,和 Host 判断无关。
不要试图在 routes.php 里用 $_SERVER 判断:CI3 的 routes.php 是纯配置文件,CI4 的 Routes.php 虽支持 PHP 语法,但其 $routes->get() 等方法只接受字符串路径和回调,不支持在定义阶段做 Host 分支——即便写了,也因执行时机错误而无效。


















