Iris 动态路由参数正则校验必须通过路由宏在注册阶段完成,如 {id:string regexp(^[a-zA-Z0-9_]{3,16}$)},配合显式小写类型声明才生效,否则退化为无校验普通字符串。

路由宏里写正则表达式,不是在 handler 里手动校验
Iris 的动态路由参数正则校验必须通过路由宏(macro)在注册阶段完成,而不是在 controller 方法里用 if !regexp.MatchString() 判断。框架会在匹配 URL 路径时直接拒绝不满足正则的请求,根本不会进入 controller —— 这是性能和安全的关键点。
常见错误是把校验逻辑写进方法体,既重复又漏掉 404 场景;正确做法是让路由系统在分发前就拦截非法路径。
-
{id:string regexp(^[a-zA-Z0-9_]{3,16}$)}:只允许字母、数字、下划线,长度 3–16 -
{date:string regexp(^\d{4}-\d{2}-\d{2}$)}:注意反斜杠要双写,匹配 YYYY-MM-DD 格式 -
{version:string regexp(^v\d+\.\d+\.\d+$)}:匹配 v1.2.3 这类语义化版本
正则宏必须配合显式类型声明,否则不生效
仅写 {name:regexp(...)} 是无效的。Iris 要求路由宏必须依附于一个基础类型,比如 string、int 或 uint64,否则解析器会跳过整个宏定义,参数退化为普通 string 且无校验。
例如 /user/{uid:regexp(^ud{6}$)} 不起作用;必须写成 /user/{uid:string regexp(^ud{6}$)}。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 类型名必须小写:
string✅,String❌ - 多个宏可叠加:
{tag:string min(1) max(32) regexp(^\w+$)} - 宏顺序无关,但
regexp和min/max不冲突,会同时校验
MVC Controller 中 By 参数绑定依赖路由宏定义
当你在 MVC controller 方法中使用 ByUid string 接收参数时,Iris 会严格检查路由中是否定义了对应 key(uid)和类型(string)。如果路由写了 {uid:int64},但方法签名是 ByUid string,绑定失败且值为零值(空字符串),无任何报错提示。
正则宏不影响绑定机制,但它确保传入的 ByUid 值已经过格式过滤——你拿到的就是合规字符串,不用再做 if !valid 判断。
- 路由定义:
app.Party("/api").Get("/item/{sku:string regexp(^SKU-\d{8}$)}", "ItemDetail") - Controller 方法:
func (c *ItemCtrl) ItemDetail(BySku string) string - 访问
/api/item/SKU-12345678✅;/api/item/ABC→ 404,根本不会调用ItemDetail
自定义宏能复用正则逻辑,但需全局注册
如果多个路由都要校验邮箱格式,重复写 regexp(^[-\w.+]+@([-\w]+\.)+[-\w]{2,}$) 易出错。可以用 iris.RegisterMacro 定义可复用的宏名,比如 email。
注意:自定义宏必须在 app := iris.New() 之后、任何路由注册之前调用,否则后续路由无法识别该宏名。
- 注册示例:
iris.RegisterMacro("email", func(param string) bool { return emailRegex.MatchString(param) }) - 使用方式:
/contact/{to:email},此时ByTo string只会收到合法邮箱 - 自定义宏返回
bool,不支持返回错误信息;错误响应统一是 404


















