英文:
how to redirect http to https in Gorilla Mux?
问题
我正在开发一个使用Gorilla Mux的golang应用程序,我想要将HTTP请求重定向到HTTPS。
以下是我目前的代码:
package main
import (
"net/http"
"github.com/gorilla/mux"
"github.com/zolamk/deviant/handlers"
"github.com/zolamk/deviant/lib"
)
func main() {
router := mux.NewRouter()
// 这是我尝试重定向的地方
router.PathPrefix("/").Schemes("HTTP").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
http.Redirect(res, req, fmt.Sprintf("https://%s", req.URL), http.StatusSeeOther)
})
router.Handle("/", handlers.ContextHandler(handlers.Index)).Methods("GET")
router.Handle("/register/", handlers.ContextHandler(handlers.Register)).Methods("GET")
router.Handle("/register/", handlers.ContextHandler(handlers.RegisterPost)).Methods("POST")
router.Handle("/login/", handlers.ContextHandler(handlers.Login)).Methods("GET")
router.Handle("/login/", handlers.ContextHandler(handlers.LoginPost)).Methods("POST")
router.Handle("/logout/", handlers.ContextHandler(handlers.Logout)).Methods("GET")
if lib.Settings.ServeStatic {
router.PathPrefix("/public/").Handler(http.FileServer(http.Dir("./")))
}
router.NotFoundHandler = handlers.ContextHandler(handlers.NotFound)
log.Printf("Deviant running @ http://%s\n", lib.Settings.Address)
loggedRouter := handlers.LoggedRouter(os.Stdout, router)
log.Fatal(http.ListenAndServe(lib.Settings.Address, loggedRouter))
}
所以,就像我之前说的,如何在不影响其他路由的情况下将HTTP流量重定向到HTTPS? 谢谢。
英文:
I am developing a golang application and I am using Gorilla Mux and i want to redirect HTTP requests to HTTPS
here is what i have so far
package main
import (
"net/http"
"github.com/gorilla/mux"
"github.com/zolamk/deviant/handlers"
"github.com/zolamk/deviant/lib"
)
func main() {
router := mux.NewRouter()
// this is where i am trying to redirect
router.PathPrefix("/").Schemes("HTTP").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
http.Redirect(res, req, fmt.Sprintf("https://%s", req.URL), http.StatusSeeOther)
})
router.Handle("/", handlers.ContextHandler(handlers.Index)).Methods("GET")
router.Handle("/register/", handlers.ContextHandler(handlers.Register)).Methods("GET")
router.Handle("/register/", handlers.ContextHandler(handlers.RegisterPost)).Methods("POST")
router.Handle("/login/", handlers.ContextHandler(handlers.Login)).Methods("GET")
router.Handle("/login/", handlers.ContextHandler(handlers.LoginPost)).Methods("POST")
router.Handle("/logout/", handlers.ContextHandler(handlers.Logout)).Methods("GET")
if lib.Settings.ServeStatic {
router.PathPrefix("/public/").Handler(http.FileServer(http.Dir("./")))
}
router.NotFoundHandler = handlers.ContextHandler(handlers.NotFound)
log.Printf("Deviant running @ http://%s\n", lib.Settings.Address)
loggedRouter := handlers.LoggedRouter(os.Stdout, router)
log.Fatal(http.ListenAndServe(lib.Settings.Address, loggedRouter))
}
so like i said before how do i redirect HTTP traffic to HTTPS without affecting my other routes? Thank You.
答案1
得分: 16
在另一个端口上启动另一个HTTP处理程序,并在单独的Go协程中执行。
go http.ListenAndServe(":80", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "https://"+r.Host+r.URL.String(), http.StatusMovedPermanently)
}))
英文:
Start another HTTP handler on the other port in a separate go routine
go http.ListenAndServe(":80", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "https://"+r.Host+r.URL.String(), http.StatusMovedPermanently)
}))
答案2
得分: 2
我最终做的是编写了一个中间件,将HTTP请求重定向到HTTPS。
func RedirectToHTTPSRouter(next http.Handler) http.Handler {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
proto := req.Header.Get("x-forwarded-proto")
if proto == "http" || proto == "HTTP" {
http.Redirect(res, req, fmt.Sprintf("https://%s%s", req.Host, req.URL), http.StatusPermanentRedirect)
return
}
next.ServeHTTP(res, req)
})
}
func main() {
router := mux.NewRouter()
httpsRouter := RedirectToHTTPSRouter(router)
log.Fatal(http.ListenAndServe(lib.Settings.Address, httpsRouter))
}
以上是你要翻译的内容。
英文:
What I ended up doing was that, I wrote a middleware that redirects HTTP requests to HTTPS
func RedirectToHTTPSRouter(next http.Handler) http.Handler {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
proto := req.Header.Get("x-forwarded-proto")
if proto == "http" || proto == "HTTP" {
http.Redirect(res, req, fmt.Sprintf("https://%s%s", req.Host, req.URL), http.StatusPermanentRedirect)
return
}
next.ServeHTTP(res, req)
})
}
func main() {
router := mux.NewRouter()
httpsRouter := RedirectToHTTPSRouter(router)
log.Fatal(http.ListenAndServe(lib.Settings.Address, httpsRouter))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论