how to redirect http to https in Gorilla Mux?

huangapple go评论83阅读模式
英文:

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

}

huangapple
  • 本文由 发表于 2017年1月12日 23:29:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/41616975.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定