Aiden
Aiden

Reputation: 1237

Is there no way to redirect from https://www.. to https://.. in Go?

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

Answers (1)

Thundercat
Thundercat

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

Related Questions