Reputation: 1237
I saw this post by someone here but there are no answers: Redirecting https://www.domain.com to https://domain.com in Go
I tried to see if I could find a way to check if the request was made with a www url by checking the variables in *http.Request
variable but all I got was relative paths and empty strings ""
.
I tried to fmt.Println()
these variables:
func handleFunc(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.URL.string())
fmt.Println(r.Host)
fmt.Println(r.RequestURI)
}
But none of these variables contained the absolute path with the www part. How can I check if a request was made from a www url? I want to figure this out so that I can redirect from www to non-www.
Is this really not even possible in Go? Some people suggested putting nginx in front of Go, but there has to be a way without nginx right? Do I really need to install and use nginx in front of Go just to do a simple redirect from www to non-www? This does not seem like a good solution to a seemingly small problem.
Is there no way to achieve this?
Upvotes: 1
Views: 787
Reputation: 120960
Wrap your handlers with a redirector:
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)
})
}
Use the redirector like this:
log.Fatal(http.ListenAndServeTLS(addr, certFile, keyFile, wwwRedirect(handler))
Upvotes: 8