codeigniter 中合并 url 多段为单参数有三种方式:uri 类拼接(动态截取)、正则路由捕获($1 获取完整子串)、查询参数传递(?path=xxx)。

CodeIgniter 默认把 URL 中每一段斜杠分隔的内容当作独立参数传给控制器方法,比如 /index.php/user/profile/123/name/age 会尝试传入 5 个参数(profile、123、name、age),但有时你希望把后面多段(如 name/age)合并成一个字符串参数。这不能靠默认路由自动完成,需要手动干预。
用 URI 类截取剩余段作为单个字符串
在控制器方法中不声明多余参数,改用 $this->uri->segment() 和 $this->uri->total_segments() 动态获取并拼接:
- 先确定“起始段号”,比如前两段是控制器和方法(
user/profile),那么第 3 段开始是你想合并的部分 - 用循环从第 3 段取到末尾,用
/连接成完整字符串 - 注意避免空段或越界,可用
isset()或!empty()判断
示例:
public function profile() {
$start = 3;
$parts = [];
for ($i = $start; $i uri->total_segments(); $i++) {
$seg = $this->uri->segment($i);
if (!empty($seg)) {
$parts[] = $seg;
}
}
$combined = implode('/', $parts); // 如得到 "name/age"
echo "合并参数:".$combined;
}
}
通过自定义路由固定段数,再用正则捕获整段
在 app/Config/Routes.php(CI4)或 application/config/routes.php(CI3)中定义带通配符的路由,把目标多段匹配为一个命名参数:
- CI4 示例:
$routes->get('user/profile/(:any)', 'User::profile/$1');——$1就是斜杠包含在内的全部后续内容 - CI3 示例:
$route['user/profile/(.+)'] = 'user/profile/$1'; - 控制器方法只需接收一个参数:
public function profile($path = ''),此时$path值就是原始 URL 中profile/后面的完整子串(如name/age)
用 query string 绕过路径解析限制
如果业务允许,把多段内容转为查询参数,最简单可靠:
- 访问 URL:
/index.php/user/profile?path=name/age - 控制器中直接获取:
$path = $this->input->get('path'); - 无需修改路由,兼容所有版本,且天然支持特殊字符和空格
三种方式里,路由正则匹配最干净,URI 拼接最灵活,query string 最省事。选哪个取决于你是否需要 SEO 友好的路径、是否接受 URL 中带问号,以及是否要保留原有路由结构。











