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

Aid*_*den 1 go

我在这里看到了这篇文章,但没有答案:Redirecting https://www.domain.com to https://domain.com in Go

我试图通过检查变量中的*http.Request变量来查看是否可以找到一种方法来检查请求是否是使用 www url 发出的,但我得到的只是相对路径和空字符串""

我尝试了fmt.Println()这些变量:

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

但是这些变量都没有包含 www 部分的绝对路径。如何检查请求是否来自 www 网址?我想弄清楚这一点,以便我可以从 www 重定向到非 www。

这在 Go 中真的不可能吗?有人建议把 nginx 放在 Go 前面,但是没有 nginx 总得有个办法吧?我真的需要在 Go 前安装和使用 nginx 来做一个简单的从 www 到非 www 的重定向吗?对于看似很小的问题,这似乎不是一个好的解决方案。

有没有办法实现这一目标?

Cer*_*món 7

用重定向器包装您的处理程序:

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)
  })
}
Run Code Online (Sandbox Code Playgroud)

像这样使用重定向器:

log.Fatal(http.ListenAndServeTLS(addr, certFile, keyFile, wwwRedirect(handler))
Run Code Online (Sandbox Code Playgroud)