2016-05-31 42 views
8

Tôi đã thiết lập TLS và nó hoạt động. Tôi biết cách viết lại từ http đến https trong nginx, nhưng tôi không dùng nginx nữa. Tôi không biết làm thế nào để làm điều này trong Go đúng cách.Làm cách nào để viết lại/chuyển hướng từ http đến https trong 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!")) 
} 

Làm cách nào để thực hiện điều này một cách tốt?

Trả lời

5

Tạo một handler mà xử lý chuyển hướng đến https như:

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

Sau đó chuyển hướng truy cập http:

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

Cảm ơn bạn rất nhiều! – Alex

+1

cho địa chỉ chuyển hướng đến, bạn nên sử dụng '" https: // "+ r.Host + r.RequestURI', điều này sẽ tránh được tên máy chủ hoặc địa chỉ IP của bạn được mã hóa cứng. –

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

Cảm ơn sự giúp đỡ của bạn! Tôi đưa ra câu trả lời cho bài viết khác đó là một vài giờ trước đó. Chúc bạn ngày mới tốt lành! – Alex

+0

Có vấn đề gì ở đây với địa chỉ 127.0.0.1 rõ ràng không? Nó có thể cần tên miền được liên kết, ví dụ: "https: //" + tên miền + r.RequestURI. –

+0

Ngoài ra, 443 là cổng mặc định cho https và có thể bỏ qua. –

Các vấn đề liên quan