Golang在AWS中重定向到HTTPS

时间:2017-10-15 17:24:30

标签: amazon-web-services redirect go https

我在使用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端。

2 个答案:

答案 0 :(得分:0)

您在重定向中缺少port

  

http.Redirect(w,r,“https://”+ reqhost + r.URL.Path +“:”+ port,   http.StatusMovedPermanently)

您需要在那里添加端口。 您还可以在请求中使用邮递员查看发送的位置URL。

希望它有所帮助。

答案 1 :(得分:0)

我用

检查了我的端口上正在收听的内容
netstat -tulpn | grep LISTEN

..并且在端口80上有apache监听。关闭它或删除它都可以。