我在使用Golang服务的EC2实例中将HTTP流量重定向到HTTPS时遇到问题。直接进入https://sub.domain.com时连接正常,但HTTP的重定向似乎不起作用。
没有负载均衡器,它只使用net / http包作为Web服务器。
我也在使用iptables,它应该分别将HTTP / HTTPS请求重定向到端口8080/8081。
为了缩小可能性,应用于实例的安全组与任何IPv4或IPv6地址允许的端口80和443建立连接。
这是服务于HTTPS的服务器代码,应该重定向HTTP请求;
// LetsEncrypt setup
certManager := autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("sub.domain.com"), // your domain here
Cache: autocert.DirCache("certs"), // folder for storing certificates
}
server := &http.Server{
Addr: ":8081",
Handler: context.ClearHandler(http.DefaultServeMux),
TLSConfig: &tls.Config{GetCertificate: certManager.GetCertificate},
}
// open https server
err = server.ListenAndServeTLS("", "")
if err != nil {
fmt.Printf("ListenAndServe: %s\n", err)
}
// redirect everything to https
go http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
reqhost := strings.Split(r.Host, ":")[0]
http.Redirect(w, r, "https://" + reqhost + r.URL.Path, http.StatusMovedPermanently)
}))
以下是来自iptables的PREROUTING规则,其他链是空的;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
7 420 REDIRECT tcp -- eth0 any anywhere anywhere tcp dpt:https redir ports 8081
45 2508 REDIRECT tcp -- eth0 any anywhere anywhere tcp dpt:http redir ports 8080
两个重定向都在请求时获取数据包,但8080不会将连接重定向到HTTPS端。
答案 0 :(得分:0)
您在重定向中缺少port
http.Redirect(w,r,“https://”+ reqhost + r.URL.Path +“:”+ port, http.StatusMovedPermanently)
您需要在那里添加端口。 您还可以在请求中使用邮递员查看发送的位置URL。
希望它有所帮助。
答案 1 :(得分:0)
我用
检查了我的端口上正在收听的内容netstat -tulpn | grep LISTEN
..并且在端口80上有apache监听。关闭它或删除它都可以。