Fiber 的 Group 不是自动拼前缀的魔法盒子,它返回新 *fiber.Router,子路由路径必须写全量(含前缀),否则 404;Group 前缀仅用于注册时拼接,不参与运行时匹配。

直接说结论:Fiber 的 Group 不是“自动拼前缀的魔法盒子”,它返回一个新 *fiber.Router,但所有子路由路径仍需写全量(含前缀),否则匹配失败。写错就 404,而且查起来毫无提示。
为什么 api.Group("/v1") 后写 api.Get("/users", h) 能匹配 /v1/users?
因为 Group 本身不修改路径解析逻辑,它只是提供一个作用域隔离的路由注册器。你传入的 "/v1" 只用于构造该组的上下文,并不参与路径匹配;真正起作用的是你在 Get、Post 等方法里写的第一个参数——那个字符串路径。
-
app.Group("/v1")返回一个新 router 实例,比如叫v1 -
v1.Get("/users", h)注册的完整路径就是/v1/users(Fiber 内部会把 group 前缀和子路径拼起来) - 但这个拼接是 Fiber 在注册时做的,不是运行时动态补的;所以你不能指望
v1.Get("users", h)自动变成/v1/users - 更不能写成
v1.Get("/v1/users", h),否则实际注册的是/v1/v1/users,请求/v1/users就 404
分组中间件只对本组生效,但顺序容易搞混
你在 v1.Use(auth) 注册的中间件,只会跑在 /v1/xxx 匹配成功的请求上,不会影响 /admin/xxx 或根路径。但它执行时机在全局中间件之后、具体 handler 之前——这点常被忽略。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 假设你有
app.Use(logger)和v1.Use(auth),访问/v1/users的执行顺序是:logger → auth → getUsers - 如果
auth里调了c.Status(401).Send(),后续就不会进getUsers,但logger已经记了一条日志 - 别在中间件里无条件调
c.Next(),它只在响应未写出时才继续;一旦写了响应,Next()就失效 - 调试时可在每个中间件开头加
log.Printf("in %s", "auth"),看控制流卡在哪
嵌套 Group 容易导致路径失控,建议扁平化
像 api.Group("/v1").Group("/users") 这种写法看似清晰,实则埋雷:它最终注册的路径是 /v1/users/xxx,但中间多了层对象跳转,可读性差,重构时也难定位。
- 推荐用变量显式管理前缀:
v1 := app.Group("/v1")、users := v1.Group("/users"),再users.Get("/list", h) - 避免
app.Group("/api").Group("/v1").Group("/users"),这种链式调用会让路径来源分散,grep 都难搜全 - 若模块边界明确(如 user、order、payment),直接用独立变量比嵌套更可控
- 注意:Group 不支持通配符前缀,
app.Group("/api/:version")会 panic;版本控制必须用固定字符串或靠 handler 解析
StrictRouting 开启时,/v1/users 和 /v1/users/ 是两条不同路由
Fiber 默认开启 StrictRouting: true,这意味着末尾斜杠不等价。你只注册了 v1.Get("/users", h),那 GET /v1/users/ 就是 404——这不是 bug,是设计。
- 别急着关 StrictRouting:
fiber.New(&fiber.Config{StrictRouting: false}),它会导致/users和/users/:id冲突 - 更稳妥的做法是统一前端调用习惯,确保 SDK、OpenAPI 文档、curl 示例都用无尾斜杠
- 若必须兼容,加个重定向中间件:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) } - 或者显式注册两个路由:
v1.Get("/users", h)和v1.Get("/users/", redirectHandler)
最易被忽略的一点:Group 的前缀字符串必须是字面量或常量,不能是运行时拼接的变量(比如从配置文件读取后拼进 Group),否则单元测试和静态分析会丢失路径信息,CI 阶段难发现路由缺失问题。


















