{param:path}是iris中唯一支持多段路径匹配的通配符类型,必须显式声明、置于路径末尾,仅捕获其后剩余路径且不含开头斜杠;未声明类型的参数默认单段匹配;它性能优于正则宏,语义明确,适用于嵌套路由和兜底路由场景。

通配符路径在 Iris 中对应 {param:path} 类型
不是所有带斜杠的参数都能匹配多段路径,只有显式声明为 path 类型的参数才支持捕获整个剩余路径。比如 /files/{p:path} 能匹配 /files/a/b/c.txt,而 /files/{p:string} 或不写类型时只会匹配到第一个 / 前的部分(即 a),其余被截断或导致 404。
常见错误是误以为 {p} 或 {p:string} 可以兜底任意深度路径——它不能。Iris 的路由解析器在遇到未指定类型的参数时,默认行为是“单段匹配”,且不包含 /。
-
{p:path}必须放在路径末尾,否则后续路径无法被识别(如/api/{p:path}/v2是非法的) - 一个路由中只能有一个
{p:path}参数 - 匹配后,
ctx.Params().Get("p")返回的是原始路径片段,不含开头的/,例如请求/files/img/avatar.jpg→Get("p")返回"img/avatar.jpg"
{param:path} 和正则宏的性能与可读性取舍
Iris 内部对 {param:path} 做了特殊优化:它绕过正则编译,直接做前缀匹配,比手写 {p:regexp(.*?)} 更快、更安全。除非你有精确的路径过滤需求(比如只允许 .jpg 或 .png 结尾),否则别用正则宏替代 path 类型。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 正则宏如
{p:regexp(^.*\.(jpg|png)$)}会触发 Iris 的正则预编译流程,增加首次路由注册开销 - 正则表达式若写错(比如漏转义点号),会导致整个路由注册失败,且错误提示不明确
-
{p:path}是语义明确、零配置、无副作用的选择;需要过滤时,把校验逻辑放到 handler 里更清晰
嵌套路由组 + {param:path} 容易踩的坑
当你在子路由组(Party)里注册 {p:path},要注意路径拼接规则:子组前缀会自动加在路径前面,但 {p:path} 仍只捕获其所在段之后的内容。比如:
admin := app.Party("/admin")
admin.Get("/assets/{file:path}", assetHandler)
这个路由实际匹配的是 /admin/assets/js/app.js,其中 file 参数值为 "js/app.js",不是 "admin/assets/js/app.js"。如果你期望捕获完整路径(含 /admin/assets/),那就不能用 Party,得写成绝对路径:app.Get("/admin/assets/{file:path}", ...)。
- 子路由组的前缀是静态拼接的,不影响
{param:path}的捕获范围 - 多个嵌套
Party(如app.Party("/v1").Party("/users"))会让路径前缀变长,但{id:int}等普通参数不受影响 - 如果想统一处理所有
/admin/**请求,用{p:path}比用通配符中间件更轻量、更符合路由本意
为什么 {p:path} 不等价于 * 或 **(像 Express 那样)
Iris 没有全局通配符语法(如 * 或 **),它的设计哲学是“显式优于隐式”。{p:path} 是唯一能捕获多段路径的机制,但它必须绑定到具体命名参数,不能省略名称或写成 {:path} 这类匿名形式。这意味着你无法定义一个“兜底所有未匹配路径”的路由,除非你手动注册一个类似 app.Any("/{p:path}", fallbackHandler) 的兜底路由——但要注意它必须放在所有其他路由之后,否则会提前拦截。
-
app.Any("/{p:path}", ...)会匹配所有 HTTP 方法 + 所有路径,包括/,容易掩盖静态路由 - 这种兜底路由应仅用于 404 处理或调试,生产环境建议配合
OnErrorCode(iris.StatusNotFound, ...)使用 - 不要试图用
{p:path}实现文件系统式路径遍历(如/a/b/c/d→ 查找a/b/c/d.go),那属于业务逻辑,Iris 不提供路径映射到文件的内置能力
/api/users/{id:int} 优先级高于 /api/{p:path},哪怕后者先注册。所以兜底路由一定要确保它是最宽松的模式,否则可能根本不会触发。










