最快方式是直接调用middleware.HTTPSRedirect()实现HTTP到HTTPS的301跳转,但它仅监听:80端口、不支持自定义状态码或路径跳过,且无法与自定义http.Server共存;生产环境应显式启动独立:80 HTTP服务器,用http.Redirect发送301,并确保HTTPS服务证书有效、完整链、私钥未加密且权限为0600。

用 middleware.HTTPSRedirect() 最快但有硬限制
直接调用 e.Pre(middleware.HTTPSRedirect()) 能让所有 HTTP 请求 301 跳转到 HTTPS,但它只监听 :80 端口、不支持自定义状态码或跳过路径,且无法和自定义 http.Server 配合——如果你已经手动启了 http.Server{Addr: ":80"},再调这个会 panic。
HTTPSRedirectWithConfig 支持自定义跳转行为
需要改状态码(比如用 http.StatusTemporaryRedirect)、加条件跳过某些路径,或统一走某个域名前缀时,必须用带配置的版本:
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
-
Code可设为http.StatusMovedPermanently(默认 301)或http.StatusTemporaryRedirect(307),后者保留原始请求方法(POST 不变) -
Skipper函数可返回true跳过重定向,例如开发环境或健康检查路径:if c.Request().URL.Path == "/healthz" { return true } - 注意:该中间件仍只作用于
:80监听,不能绑定到其他端口;若你监听的是:8080,它不会生效
生产环境必须手写 http.Server 监听 :80 并重定向
真实部署中,middleware.HTTPSRedirect() 的隐式端口绑定太脆弱。你应该显式起一个独立的 http.Server:
- 监听
:80,用http.Redirect发送 301,目标 URL 显式拼出https://+ Host + Path + Query - 务必加
Strict-Transport-Security头——但它只能在 HTTPS 响应里发,所以这个头不能放在这里,得在主 HTTPS server 的响应中加 - 别忘了在
http.Server上设ReadTimeout和WriteTimeout,否则慢速攻击会让 :80 连接堆积 - 启动顺序要错开:先起 HTTPS server(
e.StartTLS或自定义http.Server),再起这个 HTTP 重定向 server,避免端口冲突
证书没配好,跳转中间件也救不了 HTTPS
很多“跳转后白屏”或“iOS 客户端失败”的问题,根源不在中间件,而在 e.StartTLS 启动失败:
-
cert.pem必须是完整链(域名证书 + 中间 CA),单放证书会导致 iOS/Java 客户端报x509: certificate signed by unknown authority -
key.pem必须未加密(生成时加-nodes),否则 panic 报tls: failed to parse private key - 两个文件换行符必须是 LF,Windows 编辑器保存时选 “Unix 格式”,否则 Go crypto/tls 解析静默失败
- Linux/macOS 下私钥权限必须是
0600,0644会被底层拒绝加载,进程可能直接退出,日志只显示accept tcp: operation not permitted

















