beego正则路由必须用:param(…)语法,参数提取需显式调用this.ctx.input.param(":param");:param:int等是语法糖,不校验类型;*与.*语义不同;参数名大小写和冒号严格匹配。

Beego 的正则路由不是“写对正则就能用”,而是正则必须嵌入框架预设的语法结构里;参数提取也不是自动绑定变量,得靠 this.Ctx.Input.Param(":name") 显式取值 —— 这两点不厘清,90% 的路由匹配失败都源于此。
正则路由必须套在 :param(…) 语法壳子里
很多人直接写 beego.Router("/user/([0-9]+)", ...),结果完全不匹配。Beego 不解析裸正则,只识别形如 :id([0-9]+) 这种带冒号+参数名+括号正则的组合。
-
/:id([0-9]+)✅ 匹配/123,this.Ctx.Input.Param(":id")返回"123" -
/user/([0-9]+)❌ 框架无视括号内容,当作字面量匹配/user/([0-9]+)这个字符串 -
/:id(\d+)❌\d在 Beego v1/v2 中均不被支持,必须用[0-9]或[a-zA-Z0-9_]等 POSIX 字符类 - 多个参数可并列:
/post/:year([0-9]{4})/:month([0-9]{2}),分别取":year"和":month"
:param:int 和 :param:string 是语法糖,不是类型校验
它们只是快捷写法,底层仍转为正则::id:int 等价于 :id([0-9]+),:name:string 等价于 :name([\w]+)。但要注意:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 它不阻止非法输入进入 Controller —— 比如
/user/abc访问:id:int路由时,this.Ctx.Input.Param(":id")会返回空字符串,而非报错或 404 - 若需强校验,得在 Controller 里手动判断:
if idStr := this.Ctx.Input.Param(":id"); idStr == "" { this.Abort("404") } -
:id:int无法匹配负数或带前导零的数字(如007),因为[0-9]+不含-和前导零逻辑
通配符 * 和 .* 的行为差异极易混淆
* 是 Beego 特有语法,不是正则;而 .* 是标准正则,二者语义完全不同:
-
/download/*→ 匹配/download/a/b/c.zip,this.Ctx.Input.Param(":splat")返回"a/b/c.zip" -
/download/.*→ 匹配/download/file.json,this.Ctx.Input.Param(":path")返回"file",":ext"返回"json" -
/api/.*实际等效于/api/:path(.*),但别写成/api/*—— 后者会把整个路径段当:splat,丢失扩展名分离能力 - 如果要用
*却又想拆扩展名,得自己在 Controller 里用path.Ext()处理,框架不代劳
参数名大小写与冒号是硬性要求,拼错就取不到值
参数提取完全依赖字符串精确匹配,":Id"、"id"、":ID" 全部无效,只有 ":id" 可用:
- 路由定义为
/:userID([0-9]+),取值必须写this.Ctx.Input.Param(":userID"),少一个冒号或大小写错,返回空 - Beego 不做任何 normalize(比如转小写),也不报错提示,静默失败是最常见的调试陷阱
- 建议统一用小写字母+下划线命名,如
:user_id,避免驼峰引发的手误 - RESTful 场景下,
:id最好只用于主键,业务字段如:slug、:token应显式命名,别复用:id
真正麻烦的从来不是正则怎么写,而是框架把参数名、冒号、大小写、语法糖展开规则全耦合在字符串里 —— 改一个字符,可能就断在 Controller 取值那行,还看不出错在哪。










