CodeIgniter的路由(routes.php)与伪静态(.htaccess)分属框架内分发与服务器层重写两个层级,必须协同工作:先由.htaccess将请求(如/about)重写至index.php/news/123,再由routes.php匹配news/123并映射到对应控制器方法,缺一不可。

CodeIgniter 的路由(routes.php)和伪静态(.htaccess)是两个不同层级的机制,必须协同工作才能实现真正“干净”的 URL。路由管的是框架内部怎么分发请求;.htaccess 管的是 Web 服务器怎么把原始 HTTP 请求转给 CodeIgniter 处理。两者缺一不可,顺序也不能颠倒——先有 .htaccess 把请求送进框架,路由才有机会生效。
1. .htaccess 是入口守门人:必须先让请求抵达 index.php
浏览器访问 /about,Apache/Nginx 默认会去找磁盘上名为 about 的文件或目录。如果没找到,就直接返回 404,根本不会触发 CodeIgniter。所以第一步,必须用 .htaccess(Apache)或 Nginx 配置,把所有非真实资源的请求,全部重写到 index.php。
- Apache 根目录
.htaccess典型内容(CI3):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
- 关键点:
–!-f和!-d表示“如果不是真实文件或目录”,才重写;
–index.php/$1是 CI3 要求的格式(路径拼在index.php后面,用斜杠分隔);
– 确保 Apache 已启用mod_rewrite,且对应目录的AllowOverride设置为All。
2. 路由规则只在框架内起作用:匹配的是重写后的 URI
当 .htaccess 把 /news/123 重写成 index.php/news/123 后,CodeIgniter 才开始解析这个请求。此时它拿到的 URI 是 news/123(不带 index.php),然后去 routes.php 中逐条比对 $route 数组。
- 正确写法(按从具体到通用排序):
$route['news/archive/(:num)'] = 'news/archive/';
$route['news/(:num)'] = 'news/show/';
$route['news'] = 'news/index';
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- 注意:
– 规则顺序很重要,先匹配上的就执行,后面的跳过;
–(:num)只匹配数字,(:any)匹配任意非空字符,但不能放在前面“吞掉”更具体的规则;
–$1是捕获组的引用,对应第一个括号里的内容。
3. 常见失效原因:不是路由写错了,而是请求根本没进来
如果你改了 routes.php 却没效果,地址栏还显示 index.php/about,大概率是 .htaccess 没起作用。
- 排查步骤:
– 在浏览器中直接访问http://yoursite.com/index.php/about,看是否能正常打开(验证路由本身是否有效);
– 如果可以,说明路由没问题,问题出在重写;
– 检查.htaccess是否在项目根目录(CI3);
– 查看 Apache 错误日志,确认有没有mod_rewrite相关报错;
– 用隐身窗口测试,避免旧 302 重定向缓存干扰。
4. CI4 的区别:路径和语法都变了
CI4 不再用 $route 数组,而是在 app/Config/Routes.php 中调用 $routes->get() 等方法,并且 .htaccess 必须放在 public/ 目录下(因为入口文件 index.php 也在那里)。
- CI4 的
.htaccess(public/ 目录内):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
- CI4 的路由示例:
$routes->get('admin/users', 'AdminUsers::index');
- 注意:
– CI3 和 CI4 的.htaccess位置、路由语法、甚至默认控制器定义方式都不同,混用会导致完全静默失败;
– CI4 的group()必须用闭包写法,不能赋值。


















