ctx.Redirect是Iris中路径重定向的唯一推荐方式,用于发送301/302响应并跳转至相对或完整URL;需配ctx.StopExecution()防止后续执行,子域名跳转则须用app.SubdomainRedirect且提前注册子域。

ctx.Redirect 是 Iris 中跳转到其他网址的唯一推荐方式,不是 app.Party、不是中间件里裸调用、更不是靠修改路由分组实现。它直接写响应头 Location 并返回 301/302 状态码,浏览器收到即跳转。
用 ctx.Redirect 跳转到任意 URL
目标可以是相对路径(如 "/login"),也可以是完整 URL(如 "https://example.com/home")。注意以下几点:
- 跨协议跳转(如从
http://到https://)完全可行,但需确保目标站支持 HTTPS,否则用户会看到不安全警告 - 跨域跳转本身不受 CORS 限制——CORS 不阻止重定向,只影响后续 JS 是否能读取响应内容
- 状态码选
iris.StatusMovedPermanently(301)还是iris.StatusFound(302)取决于是否要让浏览器缓存跳转结果:SEO 迁移用 301,登录后跳转用 302 - 示例:
ctx.Redirect("https://google.com", iris.StatusFound)
别在中间件里漏掉 ctx.StopExecution()
如果你在中间件中调用 ctx.Redirect,但没跟 ctx.StopExecution(),Iris 会继续执行后续 handler,可能导致 panic(比如重复写 header)或逻辑错乱。
- 错误写法:
func(ctx iris.Context) { ctx.Redirect("/new"); }→ 后续 handler 仍执行 - 正确写法:
func(ctx iris.Context) { ctx.Redirect("/new"); ctx.StopExecution(); } - 这个组合必须成对出现,尤其在鉴权中间件里很常见(如未登录就跳转登录页)
子域名跳转不能靠 ctx.Redirect 实现
想把 mydomain.com 全量跳到 www.mydomain.com?ctx.Redirect 不适合——它只能对已匹配到某条路由的请求生效,而根域名和 www 子域名在 Iris 中默认是两个独立路由入口。
- 必须用
app.SubdomainRedirect(app, www),且www必须是已注册的子域名(app.Subdomain("www")) - 本地测试前务必改
/etc/hosts或C:\Windows\System32\drivers\etc\hosts,加两行:127.0.0.1 mydomain.com和127.0.0.1 www.mydomain.com - HTTPS 下该跳转仍生效,但浏览器会先校验证书;若证书不覆盖
mydomain.com,用户会在跳转前看到安全警告
真正容易被忽略的是:子域名重定向和路径重定向是两套互不兼容的机制,混用会导致行为不可控。比如在 app.Subdomain("api") 内部再调 ctx.Redirect,跳出去的仍是 api 子域下的路径,而不是你期望的主站地址。











