配置带id路由需三处对齐:路由规则(如$route['article/(:num)'] = 'articles/detail/$1')、控制器方法签名(public function detail($id))及web服务器隐藏index.php;id通过$1自动注入参数,须校验有效性。

给文章详情页配置带 ID 的路由,核心是让类似 /article/123 或 /news/456.html 这样的 URL 正确映射到控制器的方法,并把数字 ID 作为参数传进去。关键不在“怎么写”,而在于三处必须对齐:路由规则、控制器方法签名、Web 服务器是否已转发请求(即是否已隐藏 index.php)。
明确路由写法和占位符用法
在 application/config/routes.php(CI3)中添加如下规则:
-
$route['article/(:num)'] = 'articles/detail/$1';→ 匹配/article/789,调用Articles::detail()并传入789 -
$route['news/(\d+)\.html'] = 'news/show/$1';→ 支持带 .html 后缀,如/news/20260101.html -
$route['post/(:any)'] = 'blog/view/$1';→ 若 ID 是字符串(如 slug),用(:any);注意它会匹配所有非空字符,需放在更具体规则之后
确保控制器方法能接收参数
对应控制器(如 Articles.php)中,方法签名要与路由传递方式一致:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 用
$this->uri->segment(3)手动取第三段(适用于/article/123这类结构) - 更推荐直接定义方法参数:
public function detail($id)—— CI 会自动把$1填入$id - 记得做基础校验:
if (!is_numeric($id) || $id
检查 Web 服务器是否已正确转发请求
如果浏览器地址栏还显示 index.php/article/123,说明路由根本没生效——请求没进框架,不是路由写错了,而是 Apache/Nginx 没把 URL 重写到 index.php:
- Apache:确认
.htaccess在项目根目录,且包含RewriteRule ^(.*)$ /your-app/index.php/$1 [L] - Apache:
httpd.conf中该目录的AllowOverride必须为All,不是None - Nginx:需配置
try_files $uri $uri/ /index.php?$query_string; - 测试时用无痕窗口,避免旧 302 重定向缓存干扰
避免常见顺序和语法陷阱
路由是“从上到下”逐条匹配,一旦命中就停止,所以顺序很关键:
- ❌ 错误顺序:
$route['article/(:any)'] = 'blog/show/$1';写在最前 → 它会吃掉所有/article/xxx,包括本该走/article/archive/2026的路径 - ✅ 正确做法:把更具体的规则放前面,比如先写
$route['article/archive/(:num)'] = 'blog/archive/$1';,再写泛化规则 - ⚠️ 路由 key 中不能含点号(
.)、空格或中文;/article/123.html必须用正则article/(\d+)\.html,不能写成article/(:num).html










