2017-01-12 4 views
2

Я занимаюсь разработкой приложения golang и я использую Gorilla Mux и я хочу, чтобы перенаправить HTTP запросы HTTPSКак перенаправить http на https в Gorilla Mux?

вот что я до сих пор

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

} 

так, как я уже говорил как i перенаправить HTTP-трафик на HTTPS, не затрагивая другие мои маршруты? Спасибо.

ответ

3

То, что я в конечном итоге это было то, что я написал промежуточное программное обеспечение, которое перенаправляет 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(loggedRouter) 

    log.Fatal(http.ListenAndServe(lib.Settings.Address, httpsRouter)) 

} 
можете
+0

кого-то объясните, почему отчет о самообслуживании OP был опущен вниз? – felguerez

2

Запустить другой обработчик HTTP на другой порт в отдельный идти рутина

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) 
})) 
Смежные вопросы