Iris的ctx.Redirect不能处理HTTP→HTTPS协议跳转,仅支持路径级重定向;协议跳转需靠反向代理(如Nginx)或启动两个server实例手动重定向,且HTTPS服务必须先启动。

iris.Redirect 不能直接处理 HTTP→HTTPS 协议跳转
很多人以为用 ctx.Redirect 或 app.Get("/old", ...) 就能实现 HTTP 自动跳到 HTTPS,其实不行。Iris 的 ctx.Redirect 只负责生成 301/302 响应头,它不感知当前请求是 HTTP 还是 HTTPS,也不会主动监听 80 端口或改写协议。如果你只跑一个 HTTPS 服务(比如只监听 :443),那 HTTP 请求根本到不了 Iris,压根不会触发任何路由逻辑。
所以「自动重定向」这件事,必须在 Iris 外围完成:要么靠反向代理(如 Nginx、Caddy),要么靠操作系统级的端口监听+协议判断——而 Iris 本身只适合做路径级跳转(/login → /auth),不是协议级跳转。
正确做法:启动两个 server 实例,手动判断协议并重定向
Iris 支持同时监听 HTTP 和 HTTPS 端口,关键是在 HTTP server 的入口处,用 ctx.Redirect 主动跳转到 HTTPS 地址。这要求你:
- 确保 HTTPS 实例已配置好证书(
iris.TLS或iris.AutoTLS) - HTTP 实例监听
:80,且所有路由都统一重定向,而不是逐个写app.Get - 重定向 URL 必须显式写死协议(
https://),不能依赖ctx.Request().Host拼接,因为 Host 不含协议
示例代码片段:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
app := iris.New()
// HTTPS server
httpsApp := iris.New()
httpsApp.Configure(iris.WithConfiguration(iris.Configuration{
DisableStartupLog: true,
}))
httpsApp.Get("/ping", func(ctx iris.Context) { ctx.WriteString("ok") })
// HTTP server —— 所有请求都跳走
httpApp := iris.New()
httpApp.Any("/", func(ctx iris.Context) {
host := ctx.Request().Host // 注意:这是域名+端口,如 example.com:80
// 去掉端口,拼 https URL
if i := strings.LastIndex(host, ":"); i > 0 {
host = host[:i]
}
ctx.Redirect("https://" + host + ctx.Request().URL.RequestURI(), iris.StatusMovedPermanently)
})
// 启动两个 server(注意顺序:先启 HTTPS,再启 HTTP)
go httpsApp.ListenTLS(":443", "cert.pem", "key.pem")
httpApp.Listen(":80") // 阻塞主 goroutine
常见错误:SubdomainRedirect 或 PathCorrection 被误用于协议跳转
app.SubdomainRedirect 只处理子域名(如 example.com → www.example.com),和协议无关;DisablePathCorrection: false 是让 /path/ 自动跳到 /path,也不是 HTTP→HTTPS。这两个配置一旦启用,反而可能干扰你手动写的跳转逻辑:
- 如果同时开了
DisablePathCorrection: false和手动Redirect,可能导致两次跳转(301 → 301),浏览器报 ERR_TOO_MANY_REDIRECTS -
SubdomainRedirect要求先注册子域名路由(app.Subdomain("www")),否则 panic,但它完全不检查请求协议 - 本地测试时若没配
/etc/hosts,SubdomainRedirect看似无效,其实是 DNS 层就失败了,和 Iris 无关
更稳妥的方案:别在 Iris 里做,交给反向代理
生产环境强烈建议把协议跳转剥离出应用层。Nginx 配置三行就能搞定,稳定、高效、无需改 Go 代码:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
这样 Iris 只需专注跑在 127.0.0.1:8080(HTTP),Nginx 负责对外暴露 80/443 并做跳转和 TLS 终止。Iris 的 ctx.Request().TLS 字段才能准确反映是否经由 HTTPS 到达,避免自己解析 X-Forwarded-Proto 出错。很多新手卡在「为什么 ctx.Request().TLS 总是 nil」,其实就是没配反向代理透传头信息。
真正容易被忽略的点:当你决定在 Iris 内部做跳转时,:80 和 :443 必须由同一个进程监听,且 HTTPS server 必须先启动;否则 HTTP server 先占了端口,HTTPS 启动失败,整个跳转链就断了。


















