Iris子域名路由必须显式创建分组:用Subdomain("admin")或Party("admin.")注册,否则根app的Get/Post不绑定子域;WildcardSubdomain仅兜底未定义的子域,且不继承根中间件与依赖,需手动配置。

子域名路由必须用 Subdomain 或 Party 显式创建分组
直接在根 app 上调用 Get、Post 不会自动绑定到子域。Iris 不会根据 Host 头自动分流——你得明确告诉它“这部分路由只属于 admin.mydomain.com”。否则所有路由都注册在默认域名下,子域请求进来直接 404。
正确做法是用 app.Subdomain("admin") 创建一个新分组,它返回的 Party 实例自带子域匹配逻辑:
-
app.Subdomain("admin")→ 匹配admin.mydomain.com -
app.Subdomain("api").Subdomain("v1")→ 匹配v1.api.mydomain.com(注意顺序:后调用的子域在前) -
app.Party("admin.")效果等价于Subdomain("admin"),只是写法不同
WildcardSubdomain 处理泛子域,但静态子域优先级更高
如果你需要支持任意用户子域(如 alice.mydomain.com、bob.mydomain.com),用 app.WildcardSubdomain()。但它有个关键行为:只要存在同名的静态子域(比如你同时定义了 app.Subdomain("admin") 和 app.WildcardSubdomain()),那么 admin.mydomain.com 会命中静态分组,不会落到通配分组里。
常见误判点:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 没加静态子域时,
WildcardSubdomain能接住所有子域;加了之后,它只兜底“没被显式定义”的子域 - 本地调试必须改
hosts文件,例如添加127.0.0.1 admin.mydomain.com和127.0.0.1 any.mydomain.com -
WildcardSubdomain返回的分组不继承根app的中间件,需手动Use()
子域分组内中间件和依赖注入要单独配置
从 app.Subdomain("admin") 得到的分组,跟根 app 是隔离的。你在根上 Use() 的中间件,不会自动生效到子域路由;同样,用 hero.Register 注册的服务,若没在子域分组里重新 Dependencies().Add(),控制器里注入会失败。
典型配置漏项:
- 忘记给子域分组加日志或鉴权中间件:
admin.Use(authMiddleware) - MVC 控制器依赖数据库连接,但只在根
app注册了db服务,子域分组里没调用admin.ConfigureContainer(...) - 子域路由用了
ctx.Values().Get("user_id"),但该值由根中间件写入,子域分组没复用该中间件 → 值为空
别名和反向生成 URL 在子域下仍可用,但要注意作用域
为子域路由起别名(如 admin.Get("/dashboard", handler, "admin.dashboard"))完全可行,c.Router().URI("admin.dashboard") 也能正常生成路径。但注意:这个别名只在该子域分组内注册,根 app 或其他子域分组无法引用它。
容易出错的地方:
- 在根
app调用app.Get("/login", handler, "login"),又在admin分组里也用"login"当别名 → 启动 panic:“duplicate route name” - 模板中调用
url("admin.dashboard"),但该函数注册时传的是根app.GetRouter(),而别名实际注册在admin分组的 router 上 → 生成空字符串或原始路径 - 子域路由带参数,如
/user/{id:uint64},别名生成时传参键名写成"ID"而不是"id"→ 占位符不替换


















