dscs63759
2016-08-08 21:54
浏览 147
已采纳

在Go中没有办法从https:// www ..重定向到https:// ..吗?

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?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • douqiang5933 2016-08-08 22:07
    已采纳

    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))
    
    点赞 评论

相关推荐 更多相似问题