beego路由匹配优先级为固定路由>正则路由>自动路由:固定路由字面量全等匹配、不支持方法限定、后注册覆盖同路径前缀;正则路由按注册顺序逐条匹配,无自动优化;自动路由路径由控制器名+方法名生成、优先级最低且不支持前缀重叠。

Beego 的路由匹配不是“先注册先生效”,而是有明确的优先级顺序:固定路由 > 正则路由 > 自动路由。 一旦某条路由规则命中,后续同路径的路由不会被检查 —— 这意味着写错顺序或混用类型时,很容易出现路由“失效”但不报错的情况。
固定路由(beego.Router)优先级最高,但必须完全匹配
固定路由是字面量全等匹配,比如 beego.Router("/user", &controllers.UserController{}) 只匹配 /user,不匹配 /user/123 或 /user/(末尾斜杠也算不同路径)。它不参与正则解析,开销最小,性能最好。
- 多个固定路由若路径相同(如都注册了
"/"),后注册的会覆盖前一个 —— Beego 内部用 map 存储,重复 key 被覆盖 - 不能和正则路由共存于同一路径前缀下而不冲突,例如
beego.Router("/api", ...)和beego.Router("/api/:id", ...)同时存在时,/api请求永远走前者,后者只对带参数的路径生效 - 固定路由不支持 HTTP 方法限定(如只响应 GET),它把所有方法都交给 Controller 的对应方法(
Get()、Post()等)处理
正则路由(含 :id:int、:name:string 等语法)按注册顺序逐条匹配
正则路由实际是编译成正则表达式后依次尝试匹配。Beego 不会对正则做排序或优化,beego.Get("/api/:id", ...) 和 beego.Get("/api/:id([0-9]+)", ...) 是两条独立规则,谁先注册谁先试。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
"/api/?:id"中的?表示参数可选,匹配/api和/api/123;而"/api/:id"强制要求有值,/api会 404 -
":id:int"和":id([0-9]+)"功能等价,但前者更简洁;注意":id:int"不会自动拒绝负数或超大整数,它只做基础数字字符校验 - 使用
"/file/:path(.*)"时,ctx.Input.Param(":path")拿到的是去掉扩展名的部分(如/file/a/b/c.json→"a/b/c"),":ext"才是"json"
自动路由(beego.AddAuto)优先级最低,且不支持路径前缀重叠
beego.AddAuto(&UserController{}) 会扫描控制器所有公开方法(Get、Post 等),生成类似 /user/get、/user/post 的路由。它的路径是“控制器名 + 方法名”拼接,无法自定义语义化路径。
- 如果已存在
beego.Router("/user", &controllers.UserController{}),再调用beego.AddAuto(&UserController{}),/user/get这类路径仍能访问,但/user本身仍由固定路由接管 —— 二者不冲突,因路径不同 -
beego.AddAutoPrefix("/v1", &UserController{})生成的是/v1/user/get,但如果已有beego.Router("/v1/user", ...),则/v1/user请求仍走固定路由,不会进自动路由的Get()方法 - 自动路由无法禁用某个方法(比如不想暴露
Delete()),只能删方法或改访问控制逻辑
真正容易被忽略的是:Beego 在启动时一次性编译所有路由正则并构建匹配树,但不会验证路径是否重复或逻辑矛盾。你得自己确保 "/user/:id" 和 "/user/profile" 不同时注册 —— 后者会被前者吞掉,因为 "/user/profile" 也满足 "/user/:id" 的正则(profile 是字符串)。这种隐式覆盖,调试时只能靠日志或手动断点看 ctx.Input.Param 输出。










