2016-08-08 45 views
-2

habe ich diesen Beitrag von jemand hier, aber es gibt keine Antwort: Redirecting https://www.domain.com to https://domain.com in GoGibt es keine Möglichkeit von https: // www .. zu https: // .. in Go umzuleiten?

Ich habe versucht, wenn ich sehe eine Möglichkeit zu überprüfen, ob die Anforderung, indem Sie die Variablen in *http.Request variabel, aber alle mit einem www url gemacht wurde gefunden Ich bekam relative Pfade und leere Strings "".

Ich versuchte fmt.Println() diese Variablen:

func handleFunc(w http.ResponseWriter, r *http.Request) { 
    fmt.Println(r.URL.string()) 
    fmt.Println(r.Host) 
    fmt.Println(r.RequestURI) 
} 

Aber keine dieser Variablen enthalten den absoluten Pfad mit dem www Teil. Wie kann ich überprüfen, ob eine Anfrage von einer www-URL stammt? Ich möchte das herausfinden, damit ich von www zu non-www umleiten kann.

Ist das in Go überhaupt nicht möglich? Einige Leute schlugen vor, dass sie Nginx vor Go setzen, aber es muss einen Weg ohne Nginx geben, oder? Muss ich wirklich nginx vor Go installieren und verwenden, nur um eine einfache Weiterleitung von www zu non-www zu machen? Dies scheint keine gute Lösung für ein scheinbar kleines Problem zu sein.

Gibt es keine Möglichkeit, dies zu erreichen?

+0

Natürlich können Sie diese in Go tun können, weil Go ein Allzweck-Programmiersprache ist. Die eigentliche Frage ist, ob dies in der von Ihnen gewählten HTTP-Bibliothek möglich ist. Welche HTTP-Bibliothek verwendest du? Können Sie einen Link zu seiner Dokumentation bereitstellen? Haben Sie versucht, den Host-HTTP-Header in der Anfrage zu betrachten? –

+0

Die Unterdomäne www ist nicht Teil des Pfads, sie wird Teil des Hostfelds sein. Bitte zeigen Sie ein Beispiel von dem, was Sie sehen, da es in der 'Request.Host' oder' Request.URL' vorhanden sein sollte. – JimB

Antwort

2

Ihre Handler mit einem Redirector-Wrap:

func wwwRedirect(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
    if host := strings.TrimPrefix(r.Host, "www."); host != r.Host { 
     // Request host has www. prefix. Redirect to host with www. trimmed. 
     u := *r.URL 
     u.Host = host 
     u.Scheme = "https" 
     http.Redirect(w, r, u.String(), http.StatusFound) 
     return 
    } 
    h.ServeHTTP(w, r) 
    }) 
} 

Verwenden Sie das Redirector wie folgt aus:

log.Fatal(http.ListenAndServeTLS(addr, certFile, keyFile, wwwRedirect(handler))