首页 文章

在Go中,无法从https:// www ..重定向到https:// ..

提问于
浏览
-2

我在这里看到了这个帖子,但是没有答案: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)
}

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

在Go中,这真的不可能吗?有些人建议将nginx放在Go前面,但是必须有一种没有nginx的方法吗?我是否真的需要在Go前安装和使用nginx只是为了从www到非www进行简单的重定向?对于一个看似很小的问题,这似乎不是一个好的解决方案 .

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

1 回答

  • 2

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

    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)
      })
    }
    

    像这样使用重定向器:

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

相关问题