Fiber路由匹配基于路径段而非正则,:id仅占位、不校验格式;空段导致参数为空;*path须在末尾;StrictRouting影响结尾斜杠匹配;匹配为段级回溯,大小写敏感。

路由参数匹配只看路径段,不校验格式
Fiber 的 :id 这类参数节点只是占位符,不是正则或类型约束。只要请求路径中对应段非空且不为 /,就直接绑定到 c.Params("id") —— 比如 /user/abc、/user/123xyz 都能匹配 /user/:id,不会因为 “abc 不是数字” 而 404。
常见错误现象:/user/ 返回 404(因为 :id 段为空),或前端传了 /user//profile 导致 c.Params("id") == "";Fiber 不拦截空段,它只按 / 切分路径,空段就是空字符串。
- 参数必须独占一整个路径段:
/users/:id✅,/users:id❌,/users/:id/profile✅(中间有/) - 同级两个参数节点会覆盖:
/users/:id和/users/:name注册后,后者生效,前者失效 - 想限制格式?v3+ 可用
RegisterCustomConstraint定义校验逻辑,但匹配仍发生在运行时,不改变路由树结构
StrictRouting 影响的是路径结尾斜杠,不是参数解析
StrictRouting: true(默认)下,/users 和 /users/ 是两个完全独立的路由节点。你只注册了 app.Get("/users", handler),那 GET /users/ 就必然 404 —— 不是因为参数没取到,而是根本没走到 handler。
关掉 StrictRouting 看似“修好了 404”,但会引入更隐蔽的问题:比如同时注册了 /users 和 /users/:id,关闭后 /users/123 可能被前者捕获,c.Params("id") 拿不到值。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 推荐做法:显式注册两条路由,或加重定向中间件:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) } - 别在反向代理(如 Nginx)之外依赖 StrictRouting=false 做兼容,它改的是匹配语义,不是兜底逻辑
- 微服务内部调用建议保持 StrictRouting=true,避免路径歧义
通配节点 *path 只能出现在路径末尾
*path 是 Fiber 基数树里的特殊节点,用于捕获剩余全部路径段,但它有硬性限制:只能作为最后一个路径段出现。例如 /static/*filepath 合法,而 /a*b/c 或 /api/v1/*version/info 会直接报 invalid pattern。
常见错误现象:写错位置导致启动失败,或本意是想捕获中间段却用了 *,结果路由注册不成功。
- 通配节点优先级低于静态和参数节点:若
/files/:id和/files/*path共存,/files/123匹配前者,/files/abc/def才走后者 - 通配节点不阻断前缀共享,但会覆盖同级其他节点 —— 所以不要在同一个父节点下混用多个
* - 想做路径重写或代理?别依赖
*path处理逻辑,应在 handler 内用c.Params("*")拿到完整剩余路径再判断
路由匹配是路径段级回溯,不是全路径正则
Fiber 的基数树不靠正则匹配,而是逐段导航:先找公共前缀,再对剩余路径段尝试静态子节点 → 参数节点(:id)→ 通配节点(*path)。某一段没命中,就回退到上一级尝试其他分支。
这意味着 /api/v1/users 和 /api/v1/:version 可共存,请求 /api/v1/posts 会先进入 /api/v1/ 节点,再因 posts 不是静态子节点,转而匹配 :version 参数节点。
- 大小写敏感:默认
/User≠/user,除非初始化时设CaseSensitive: false - 路径段为空(如
//)会导致参数绑定为空字符串,Fiber 不过滤也不报错 - 性能关键点:匹配过程全程无锁、O(k),但如果你在 handler 里做了同步阻塞操作(如没超时的 HTTP 调用),P95 延迟会飙升,和路由树无关


















