CodeIgniter伪静态核心是路由映射URL路径,关键在路由配置、URI段定位与base_url一致:详情页如/article/123.html→article/show/123;分页需匹配uri_segment与base_url;混合场景如/blog/category/php/2需同步路由、参数接收和分页配置。

CodeIgniter 用路由实现分页或详情页伪静态,核心不是“让分页变伪静态”,而是**用路由规则把带参数的 URL 映射成干净、可读的路径**,再配合分页类或控制器逻辑正确提取页码或 ID。关键在三点:路由配置、URI 段定位、base_url 构造一致。
伪静态详情页:比如 /article/123.html → 跳到 article/show/123
在 application/config/routes.php 中加规则:
$route['article/(:num)\.html'] = 'article/show/$1';-
$route['news/([\w\-]+)\.html'] = 'news/detail/$1';(支持英文 slug)
控制器方法要能接收参数:
public function show($id) {
$id = (int) $id;
$data['article'] = $this->article_model->get_by_id($id);
$this->load->view('article/view', $data);
}
注意:不要在路由里写 index.php,CI 自动处理;.html 后缀只是视觉伪静态,实际不生成文件。Apache 或 Nginx 需已开启重写(去掉 index.php),否则访问 /article/123.html 会 404。
伪静态分页:比如 /users/page/2 → 实际走 users/index/2
这是最常用也最容易出错的方式。路由本身不用改,默认就能匹配:
- URL 是
/users/page/2,对应控制器Users::index($page) - 分页类默认从 URI 第三段取页码 →
uri_segment = 3(不用额外路由) -
但 base_url 必须和实际路径对齐:
'base_url' => site_url('users/index')或'base_url' => '/users/page/'
如果想改成 /users/2 这种极简形式,路由这样写:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
$route['users/(:num)'] = 'users/index/$1';
此时页码在 URI 第二段,必须同步改分页配置:'uri_segment' => 2,否则点链接永远跳第 1 页。
混合伪静态 + 分页:比如 /blog/category/php/2
适用多级筛选场景。先定义带变量的路由:
$route['blog/category/(:any)/(:num)'] = 'blog/category/$1/$2'; $route['blog/category/(:any)'] = 'blog/category/$1'; // 默认第 1 页
控制器接收两个参数:
public function category($slug = '', $page = 1) {
$page = (int) $page;
$offset = ($page - 1) * $this->per_page;
$data['list'] = $this->blog_model->get_by_category($slug, $this->per_page, $offset);
$data['total'] = $this->blog_model->count_by_category($slug);
<pre class="brush:php;toolbar:false;">$config['base_url'] = site_url("blog/category/$slug");
$config['total_rows'] = $data['total'];
$config['per_page'] = $this->per_page;
$config['uri_segment'] = 4; // 因为 /blog/category/php/2 → 第四段是页码
$this->pagination->initialize($config);
$this->load->view('blog/list', $data);}
这里 base_url 不带页码,分页类会自动在后面拼 /2、/3 —— 所以路由必须能匹配这个结构。
避坑要点
-
base_url 和路由路径必须语义一致:如果路由是
article/(\d+)\.html,就别把 base_url 设成site_url('article/detail'),否则生成的链接是/index.php/article/detail/2,不匹配路由 - 启用伪静态后,
uri_segment值要按真实 URL 段数数,不是按控制器方法参数位置数 - Apache 的 .htaccess 必须正确,否则所有伪静态 URL 都 404;Nginx 需配
try_files $uri $uri/ /index.php?$query_string; - 不要用 GET 参数(如 ?page=2)混搭伪静态路由,容易冲突;要么全路径式,要么全查询式










