最常用且原生支持的主域到www子域重定向方式是app.SubdomainRedirect(app, www):需先调用app.Subdomain("www")定义子域路由组,再传入主应用实例和www子域Party实例;该路由器包装器级重定向不经过handler、性能高,本地测试需修改hosts文件添加127.0.0.1 mydomain.com www.mydomain.com,路径自动保留(如mydomain.com/users/login→www.mydomain.com/users/login)。

怎么用 SubdomainRedirect 实现主域到 www 子域重定向
最常用且原生支持的重定向方式是子域名跳转,比如把 mydomain.com 全量跳到 www.mydomain.com。Iris 提供了 app.SubdomainRedirect(),它不是中间件,而是基于路由器包装器的底层重定向机制,不经过任何 handler,性能高、无副作用。
关键点在于:必须先用 app.Subdomain("www") 定义子域路由组(哪怕里面只注册一个空路由),再调用 app.SubdomainRedirect(from, to);from 是主应用实例(即 app),to 是子域 Party 实例(如 www)。
- 本地测试需修改
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows),添加127.0.0.1 mydomain.com www.mydomain.com - 重定向路径保留原始 path,
mydomain.com/users/login→www.mydomain.com/users/login,不是 301 到根路径 - 该方法只处理 HTTP/HTTPS 请求,不干预静态文件服务或中间件执行链
怎么手动配置 301/302 路径级重定向
对特定路径做跳转(如 /old → /new),直接注册 GET 路由并写响应即可,不需要中间件或额外库:
app.Get("/old", func(ctx iris.Context) {
ctx.Redirect("/new", iris.StatusMovedPermanently) // 301
// 或 ctx.Redirect("/new", iris.StatusFound) // 302
})
注意:ctx.Redirect() 内部已自动调用 ctx.StopExecution(),无需再手动加;但如果你在中间件里做跳转,就必须自己补 ctx.StopExecution(),否则后续 handler 仍会执行。
立即学习“go语言免费学习笔记(深入)”;
- 状态码选
iris.StatusMovedPermanently(301)还是iris.StatusFound(302)取决于是否要让客户端缓存跳转结果 - 目标路径支持绝对 URL(如
"https://example.com"),也支持相对路径(如"/home") - 别在 POST 路由里用
ctx.Redirect()后继续处理业务逻辑——重定向已发出,后续代码无效且易引发 panic
为什么不能靠中间件统一做重定向逻辑
有人试图在全局中间件里判断 ctx.Path() 然后统一跳转,这容易出问题:中间件执行时请求体可能已被消费(比如日志中间件提前读了 Body),或者跳转逻辑和鉴权、限流等顺序冲突。
更严重的是,ctx.Redirect() 只设置 Header 和状态码,不阻断控制流;若中间件里写了 redirect 却没 ctx.StopExecution(),后续所有中间件和最终 handler 仍会运行,导致响应重复或 panic(http: superfluous response.WriteHeader)。
- 中间件适合通用拦截(鉴权、日志),不适合路径映射类重定向
- 如果真要用中间件跳转,必须严格保证:条件匹配 →
ctx.Redirect()→ctx.StopExecution()三步紧邻,且ctx.Next()不在同作用域内被执行 - 路径宏(如
/{id:uint64})本身会拦截非法参数并返回 404,这不是重定向,但能避免进 handler 再判断
OPTIONS 预检请求要不要重定向
跨域场景下,浏览器发 OPTIONS 预检时,如果你对某个路径做了重定向(比如 GET /api → /api/v1),默认 OPTIONS 请求不会被重定向,因为 Iris 不自动为 OPTIONS 注册路由。
解决办法只有两个:要么显式注册 app.Options("/api", corsHandler) 并在里面手动 redirect;要么用 CORS 中间件统一处理,让预检直接通过,不走重定向链路。
- 别指望
app.Any()或app.Match()自动覆盖 OPTIONS —— 它们只按 method 匹配,不继承重定向规则 - SubdomainRedirect 支持 OPTIONS,因为它在路由匹配前就介入,但路径级
ctx.Redirect()不支持 - 重定向逻辑越靠近路由器底层(如 SubdomainRedirect),越稳定;越往后移到中间件层,越容易受其他中间件干扰
ctx.Redirect() 是主力,中间件跳转属于边缘方案,除非你有极特殊的动态路由映射需求——那种情况,往往该换用反向代理(如 Nginx)而不是在框架层硬扛。


















