我在这里看到了这个帖子,但没有答案: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进行简单的重定向?对于一个看似很小的问题,这似乎不是一个好的解决方案。
有没有办法实现这个目标?
答案 0 :(得分:3)
使用重定向器包裹您的处理程序:
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))