Fiber 没有原生嵌套路由,Group 不自动拼接前缀,必须显式写出完整路径如 "/admin/users";app.Use 可模拟嵌套行为;动态段需手动定义且不支持多层通配符;StrictRouting 默认开启,路径末尾斜杠须严格匹配。

Fiber 没有原生嵌套路由,Group 不会自动拼接前缀
Fiber 的 Group 不是 Vue Router 或 React Router 那种语义化的嵌套路由容器。它不改变路径匹配逻辑,也不会把 /admin 和子路由 /users 自动合成 /admin/users。你必须显式写出完整路径:admin.Get("/admin/users", h) 才能匹配 GET /admin/users。
常见错误是这样写:
admin := app.Group("/admin")
admin.Get("/users", h) // ❌ 匹配的是 /users,不是 /admin/users
正确做法是把前缀带进子路由路径里:
admin := app.Group("/admin")-
admin.Get("/admin/users", h)✅ - 或者更清晰地:用变量拼接
prefix := "/admin"; admin.Get(prefix + "/users", h)
用 app.Use + 子应用模拟嵌套行为
如果你希望复用中间件、隔离路由作用域,app.Use 是比 Group 更贴近“嵌套”直觉的方式。它按前缀挂载,且对所有 HTTP 方法生效,天然适合做模块化分组:
api := app.Group("/api")
api.Use(loggingMiddleware, authMiddleware)
v1 := app.Use("/api/v1") // 注意:这里用 app.Use,不是 api.Use
v1.Get("/users", listUsers)
v1.Post("/users", createUser)
关键点:
-
app.Use("/api/v1")注册的处理器,只响应以/api/v1开头的请求(如/api/v1/users、/api/v1/users/123) - 它不修改路由树结构,但行为上等效于“挂载一个子路由空间”
- 不能用
api.Use("/v1")期望自动补前缀 ——Group实例没有Use方法,只有app有
动态段和嵌套路径要手动拆解,别依赖通配符
Fiber 路由解析是单次线性匹配,不支持 /a/:id/b/:name 这类多层动态段混用通配符的写法。想实现类似 /admin/users/123/profile 的结构,必须显式定义参数名,并控制层级深度:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
admin.Get("/admin/users/:id/profile", h)✅ 合法,:id提取为字符串 -
admin.Get("/admin/:section/:id/:action?", h)✅ 可选段仅限末尾 -
admin.Get("/admin/users/:id/*path", h)❌ 启动报错:invalid pattern -
admin.Get("/admin//users", h)❌ 不支持双斜杠,也不支持空段
参数提取后需手动校验类型(比如把 c.Params("id") 转成 int),Fiber 不做隐式转换。
StrictRouting 开启时,末尾斜杠必须严格一致
默认 app.Settings.StrictRouting = true,这意味着:
- 注册了
app.Get("/admin/users", h) - 访问
GET /admin/users/→ 404(不是 bug) - 访问
GET /admin/users→ 正常执行
不要为了兼容而关掉 StrictRouting,否则可能引发歧义(比如 /users 和 /users/:id 同时存在时,/users/123 会被误判为 /users/ + :id=123)。统一约定路径不带末尾斜杠,前端、文档、测试都按此对齐。
最易被忽略的一点:Fiber 的 “嵌套” 是开发者的组织习惯,不是框架能力。所有路由最终都扁平注册到同一张路由表里,Group 只是提供中间件继承和代码分组的便利,不生成新路由层级。真正要复用布局或嵌套渲染逻辑,得靠 handler 内部组合模板或返回结构化 JSON,而不是指望路由自动嵌套组件。










