2016-05-31 3 views
8

Я поставил TLS, и он работает. Я знаю, как переписать с http на https в nginx, но я больше не использую nginx. Я не знаю, как это сделать правильно.Как переписать/переадресовать с http на https в Go?

func main() { 

    certificate := "/srv/ssl/ssl-bundle.crt" 
    privateKey := "/srv/ssl/mykey.key" 

    http.HandleFunc("/", rootHander) 
    // log.Fatal(http.ListenAndServe(":80", nil)) 
    log.Fatal(http.ListenAndServeTLS(":443", certificate, privateKey, nil)) 
} 

func rootHander(w http.ResponseWriter, r *http.Request) { 
    w.Write([]byte("To the moon!")) 
} 

Как бы я сделал это в хорошем смысле?

ответ

5

Создайте обработчик, который обрабатывает перенаправление на HTTPS как:

func redirectTLS(w http.ResponseWriter, r *http.Request) { 
    http.Redirect(w, r, "https://IPAddr:443"+r.RequestURI, http.StatusMovedPermanently) 
} 

Затем перенаправлять трафик HTTP:

go func() { 
    if err := http.ListenAndServe(":80", http.HandlerFunc(redirectTLS)); err != nil { 
     log.Fatalf("ListenAndServe error: %v", err) 
    } 
}() 
+0

Спасибо так много! – Alex

+1

для адреса для перенаправления, вам лучше использовать '' https: // "+ r.Host + r.RequestURI', что позволит избежать жесткого кодирования вашего имени хоста или IP-адреса. –

1
Package main 
import (
    "fmt" 
    "net/http" 
) 
func redirectToHttps(w http.ResponseWriter, r *http.Request) { 
    // Redirect the incoming HTTP request. Note that "127.0.0.1:443" will only work if you are accessing the server from your local machine. 
    http.Redirect(w, r, "https://127.0.0.1:443"+r.RequestURI, http.StatusMovedPermanently) 
} 
func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hi there!") 
    fmt.Println(r.RequestURI) 
} 
func main() { 
    http.HandleFunc("/", handler) 
    // Start the HTTPS server in a goroutine 
    go http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil) 
    // Start the HTTP server and redirect all incoming connections to HTTPS 
    http.ListenAndServe(":8080", http.HandlerFunc(redirectToHttps)) 
} 
+0

Благодарим вас за помощь! Я ответил на другое сообщение, которое было несколько часов назад. Хорошего дня! – Alex

+0

Есть ли проблема с явным адресом 127.0.0.1? Может потребоваться, чтобы доменное имя было конкатенатным, например «https: //» + domain + r.RequestURI. –

+0

Кроме того, 443 является портом по умолчанию для https и может быть опущен. –

Смежные вопросы