Iris子域名路由必须用app.Subdomain()创建独立实例,不支持路径式写法;需显式绑定端口和TLS证书,中间件不自动继承,泛子域用{param}语法,ctx.Subdomain()安全提取值。

子域名路由必须用 app.Subdomain 而不是路径前缀
Iris 不支持直接在 app.Get("/sub.example.com/path") 这类写法里解析子域名;它把子域名当作 Host 头的一部分,需通过 app.Subdomain("api") 显式创建子路由实例。漏掉这步,所有带子域名的请求都会落到主路由(app)里,且无法按子域区分逻辑。
-
app.Subdomain("admin")会匹配admin.example.com,但不匹配www.admin.example.com或admin.test.example.com - 若要支持泛子域(如
user123.example.com),得用app.Subdomain("{username}"),此时ctx.Subdomain()可取到"user123" - 子域名路由注册后,**必须调用
.Listen绑定端口才能生效**,只调app.Listen主实例不会自动代理子域请求 - 本地开发时,需手动改
/etc/hosts(如加127.0.0.1 api.localhost),否则浏览器根本发不出带子域的请求
Subdomain 和 Party 混用时中间件作用域容易错乱
子域名路由是独立的 iris.Application 实例(底层是 Party 的增强版),所以 app.Use(...) 注册的全局中间件**不会自动继承**到子域实例中。常见错误是:在主 app 上挂了日志中间件,结果 api.example.com 的请求完全没日志。
- 正确做法:对每个子域实例单独调用
subApp.Use(...),或封装成函数复用 -
app.Subdomain("api").Party("/v1")是合法的,但中间件必须挂在subApp上,而不是主app - 若子域和主域共享认证逻辑,把中间件定义为函数(如
authMiddleware),再分别传入subApp.Use(authMiddleware)和app.Use(authMiddleware) - 注意:子域实例的
UseGlobal和主实例互不影响,不要指望一次注册全链路生效
HTTPS 子域名必须显式配置 TLS,不能复用主站证书路径
当用 app.Subdomain("api").ListenTLS(":443", "cert.pem", "key.pem") 时,Iris **不会自动复用主 app.ListenTLS 的证书**。如果两个子域共用同一组证书,必须各自传一遍路径;若要用不同证书(如 admin.example.com 用通配符,blog.example.com 用单独证书),就得启动多个 iris.Application 实例并分别绑定 —— Iris 不支持单实例多证书 SNI。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 错误写法:
app.ListenTLS(":443", cert, key); app.Subdomain("api").Listen(":80")→ 子域走 HTTP,主域走 HTTPS,浏览器可能因混合内容拦截 - 生产环境务必确保子域 DNS 解析和证书 SAN 字段都包含对应子域名,否则浏览器报
NET::ERR_CERT_COMMON_NAME_INVALID - 本地测试用自签名证书时,Chrome 会直接拒绝
https://api.localhost,建议改用https://api.test并配 hosts + 自签证书
子域名参数提取要用 ctx.Subdomain(),别碰 ctx.Request().Host
ctx.Subdomain() 是 Iris 提供的安全封装,它已剥离端口、标准化大小写、处理了 www 前缀等边界情况;而直接解析 ctx.Request().Host 容易出错,比如 API.EXAMPLE.COM:443 会被截成 API 或空字符串。
-
ctx.Subdomain()返回纯子域名字符串(如"api"或"user123"),无端口、无协议、无点号后缀 - 若用了泛子域
app.Subdomain("{uid}"),则ctx.Subdomain()返回匹配值,ctx.Params().Get("uid")同样可用,但前者更轻量 - 不要在中间件里缓存
ctx.Subdomain()结果到ctx.Values()再跨 handler 读取 —— 多 goroutine 下可能读到上一个请求的残留值 - 测试时用
httptest.NewRequest("GET", "https://admin.example.com/", nil),Host 头必须完整,否则ctx.Subdomain()返回空
子域名路由的坑集中在「实例隔离」和「TLS 绑定粒度」上:每个 Subdomain 是独立路由树,中间件、静态文件路径、错误处理器都得重配;HTTPS 场景下,证书和端口绑定是硬关联的,没法靠 Host 头动态切换。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










