gin应用实现http自动跳转https需启动两个独立服务:http服务监听80端口并301重定向至https,https服务用runtls或自定义http.server启用tls1.2+安全配置。

要让 Gin 应用所有 HTTP 请求自动跳转到 HTTPS,必须绕过框架默认行为,手动启动两个独立服务:一个监听 HTTP 端口做 301 跳转,另一个监听 HTTPS 端口提供真实服务;Gin 本身不支持单服务混用 HTTP/HTTPS 或内置重定向中间件。
配置 HTTP → HTTPS 301 永久跳转
这一步必须在启动 HTTPS 服务之外,额外起一个纯 HTTP 服务,仅负责发 301 响应。不能和 HTTPS 共享同一个 http.Server 实例。
第一步:定义 HTTP 重定向服务,监听 :80(或开发用 :8080)
第二步:设置 Handler,对任意路径都返回 301,并将请求 Scheme 替换为 https,Host 不变,Path 和 Query 完全透传
第三步:用 goroutine 异步启动该 HTTP 服务,避免阻塞主流程
注意:若部署在 Nginx 或云负载均衡后,此步骤通常无需手动实现,应由前置代理完成跳转;仅当 Gin 直面公网时才需启用。
启动 Gin HTTPS 服务(最简方式)
使用 r.RunTLS() 是最快启动 HTTPS 的方法,但对证书格式、路径、权限有严格要求。
调用 r.RunTLS(":443", "fullchain.pem", "privkey.pem")
确保 fullchain.pem 包含域名证书 + 所有中间 CA(缺中间证书会导致浏览器报 NET::ERR_CERT_AUTHORITY_INVALID)
【私钥文件权限必须为 0600,Linux 下若为 0644,Go 会静默拒绝加载并报 tls: private key does not match public key】
开发调试请改用 ":8443",避免申请 root 权限;正式上线再切回 443。
手动配置 http.Server 启动 HTTPS(高阶控制)
当需要强制 TLS 1.2+、禁用弱密码套件、或启用客户端证书验证时,必须放弃 RunTLS,自行构造 http.Server。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
方法一:基础自定义 Server
声明 srv := &http.Server{Addr: ":443", Handler: r}
设置 TLSConfig: &tls.Config{MinVersion: tls.VersionTLS12}
调用 srv.ListenAndServeTLS("fullchain.pem", "privkey.pem")
方法二:完整安全加固(推荐生产)
在 TLSConfig 中显式禁用 TLS 1.0/1.1:CurvePreferences: []tls.CurveID{tls.X25519, tls.CurvesSupported[0]}
添加 GetCertificate 回调支持 SNI 多域名(如需托管多个 HTTPS 域名)
【证书路径必须是绝对路径或相对于当前工作目录的可读路径;二进制运行位置与代码中相对路径不一致时,会报 open xxx.pem: no such file or directory】
Gin 内部路径重定向(非 HTTPS 跳转)
仅用于同一服务内路径变更,不改变协议、不修改地址栏 URL,适用于旧路由迁移或逻辑归并。
用 c.Redirect(http.StatusMovedPermanently, "/new-path") 实现 301 页面跳转
用 c.Request.URL.Path = "/target"; r.HandleContext(c) 实现内部转发(地址栏不变)
前者适合 SEO 友好迁移,后者适合隐藏真实处理路径或复用中间件链










