ctx.Redirect 用于302临时重定向,默认状态码为302;需用绝对URL或拼全协议+主机,301需显式指定,不可在重定向后写响应体,应避免中间件全局匹配而改用路由级重定向。

用 ctx.Redirect 做 302 临时重定向最常用
Iris 默认提供 ctx.Redirect 方法,底层调用 http.Redirect,行为符合 HTTP 规范。它接受两个参数:目标 URL 和状态码(可选),不写状态码时默认为 302。
常见错误是传入相对路径却没加协议和主机,比如 ctx.Redirect("/login") —— 这会拼到当前请求的 Host 后,但若原始请求来自 HTTPS 而服务监听在 HTTP 端口,就可能跳错协议;更稳妥的是用 ctx.Scheme() + ctx.Host() 拼全地址,或直接用绝对 URL。
-
ctx.Redirect("https://example.com/home", 301)→ 强制跳转,客户端缓存重定向 -
ctx.Redirect("/dashboard", 302)→ 相对路径,依赖当前请求上下文解析 - 避免
ctx.Redirect("dashboard")(缺斜杠)→ 可能变成路径拼接,如/admin/dashboard变成/admin/dashboard而非/dashboard
需要 301 永久重定向时必须显式传状态码
Iris 不会根据方法名自动区分 301/302,ctx.Redirect 的第二个参数决定语义。搜索引擎和浏览器对 301 更敏感:会缓存跳转、传递 SEO 权重;而 302 默认不缓存,适合登录后跳回原页面这类临时场景。
如果漏掉状态码,永远是 302,哪怕你心里想的是“这个旧 URL 永远不用了”。线上环境改用 301 前务必确认旧路径已下线,否则用户刷新可能卡在缓存跳转里出不来。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 永久迁移:用
ctx.Redirect("https://new-site.com/", 301) - 登录后返回:用
ctx.Redirect(ctx.FormValue("redirect"), 302)(注意校验redirect是否同域) - 别写
ctx.Redirect("/old", 301)后还保留/old路由 → 客户端可能反复跳,服务端日志里出现循环重定向
路由级重定向:用 app.Get("/old").HandleFunc(...) 替代中间件
不要为了重定向去写中间件拦截一堆路径——Iris 的路由树足够灵活,直接注册一条路由,内部调用 Redirect 即可。这样既清晰又高效,还能被 app.Match 或组路由统一管理。
例如把所有 /v1/* 请求转到 /api/v1/*,用通配符比正则更轻量,也避免中间件里手动解析路径出错。
app.Get("/login", func(ctx iris.Context) { ctx.Redirect("/auth/login", 301) })app.Get("/v1/{any:path}", func(ctx iris.Context) { ctx.Redirect("/api/v1/" + ctx.Params().Get("any"), 301) })- 避免在
UseGlobal里做路径匹配重定向 → 所有请求都进逻辑,性能差且难 debug
重定向后无法获取响应体?这是 HTTP 协议限制,不是 Iris 问题
HTTP 3xx 响应本就不该带 body,浏览器收到 301/302 后会立刻发起新请求,忽略原响应内容。所以你在 ctx.Redirect 后再写 ctx.WriteString("done") 是无效的,也不会报错,只是被丢弃。
如果需要“跳转前提示”,得换思路:要么前端 JS 跳转并显示 toast,要么服务端渲染一个含 <meta http-equiv="refresh"> 的页面(不推荐),或者用 ctx.SetStatusCode(200) + JSON 返回跳转信息让前端控制(适合 API 场景)。
- 错误写法:
ctx.Redirect("/ok"); ctx.JSON(iris.Map{"msg": "redirecting..."})→ JSON 不会发送 - API 场景建议:
ctx.JSON(iris.Map{"redirect_to": "/ok", "status": "redirecting"}),由前端判断跳转 - 表单提交后重定向,一定要用 POST-Redirect-GET 模式,否则刷新导致重复提交


















