CodeIgniter路由正则不生效主因是请求未进入路由解析环节,根源在于URI解析失败、规则顺序错误、CI3/CI4语法混用、Web服务器重写未配置四类问题。

CodeIgniter 路由正则不生效或参数捕获错误,通常不是正则写错了,而是被底层机制“拦在门外”——请求根本没进路由解析环节。核心问题往往出在 URI 解析、规则顺序、语法版本错配这三处。
检查 URI 协议是否导致 parse_url 失败
如果 URL 中含冒号(如 /article/2026:1024)、空格、未编码的特殊字符,CI 内部调用 parse_url() 会直接返回 false,整个 URI 字符串变为空,后续所有路由规则都不执行,框架可能退回到默认控制器或跳首页。
- 确认
$config['uri_protocol']设置合理:优先试'REQUEST_URI'或'AUTO',避免强制设为'PATH_INFO'(Nginx 下易出问题) - 浏览器地址栏中手动访问带冒号的路径时,打开开发者工具 Network 面板,看实际发出的 REQUEST_URI 值是否完整;若已截断或为空,说明 CI 在第一步就失败了
- 临时在
system/core/URI.php的_parse_request_uri()方法开头加一行log_message('error', 'Raw URI: ' . $_SERVER['REQUEST_URI']);,查日志确认原始值
验证正则语法与匹配逻辑是否匹配预期
CI 的 (:any) 等占位符本质是简写正则:(:any) ≡ ([^/]+),只匹配**单段**(不含斜杠);而真正捕获多段或剩余全部路径,必须用原生 PCRE 正则,例如 (.*) 或 ([^/]+/[^/]+/.*)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 错误写法:
$route['blog/(.*)'] = 'posts/show/$1';→$1会包含开头的/,传给方法时变成show('/2026/10'),控制器里需额外trim($slug, '/') - 推荐写法:
$route['blog/([a-zA-Z0-9\-_]+)'] = 'posts/show/$1';,限定字符范围,避免注入,且$1干净无斜杠 - 要捕获任意深度路径并降级为三段处理:
$route['([a-z]+)/([a-z]+)/([a-z]+)/.*'] = 'pages/view/$1/$2/$3';,注意必须放在$route['(:any)/(:any)/(:any)']这类规则之后
确认框架版本与路由文件位置、语法完全对应
CI3 和 CI4 的路由机制互不兼容。混用会导致“静默失效”——没报错,但规则全被忽略。
- CI3:只认
application/config/routes.php中的$route数组赋值;写$routes->get()无效 - CI4:只认
app/Config/Routes.php中通过$routes->get()、$routes->add()等方法注册的规则;$route数组已废弃,写了也白写 - 升级项目后务必删掉旧 routes.php 里的数组规则,并清空
writable/cache/下的路由缓存(CI4 运行php spark cache:clear)
排除 Web 服务器重写干扰
浏览器地址栏还显示 index.php?那请求压根没进 CodeIgniter,更别说路由了。所有正则调试都是徒劳。
- Apache:确保
.htaccess放在public/目录(CI4)或项目根目录(CI3),内容含有效重写规则,且AllowOverride All已启用 - Nginx:
server块中必须有try_files $uri $uri/ /index.php?$query_string;,且fastcgi_param SCRIPT_FILENAME指向正确的index.php路径 - 测试技巧:直接访问
http://yoursite.com/index.php/blog/test,若能通但去掉index.php就 404,问题 100% 出在重写配置










