go - 有没有办法从 https ://www. 重定向。到 https ://. 。在围棋?

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

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

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

没有办法实现吗?

最佳答案

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

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

关于go - 有没有办法从 https ://www. 重定向。到 https ://. 。在围棋?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38839094/

相关文章:

go - 在 Go 中转换一片 slice ?

json - Golang JSON 解码多个调用

user-interface - 如何在 QML 中创建一个没有标题栏但带有关闭/最小化/最大化按钮的窗口?

go - 为什么在 golang 中不断逃逸到堆中?

go - 如何在 Windows 中控制文件访问?

google-app-engine - 如何切换google app engine账号来部署应用?

git - 将 gitea 绑定(bind)到 localhost 地址以进行隧道传输?

go - Go语言如何将字符串中的多个斜杠(///)替换为一个斜杠(/)?

go - 如何使用SingleFlight分享下载的大文件?

url - 将 "%20"传递到要编码为 URL 的字符串中而不将其转换为空格?