如何检查请求是通过 HTTP 还是 HTTPS [重复]

Posted

技术标签:

【中文标题】如何检查请求是通过 HTTP 还是 HTTPS [重复]【英文标题】:How to check if a request was made over HTTP or HTTPS [duplicate] 【发布时间】:2019-11-08 22:31:24 【问题描述】:

如果对 HTTP 进行 api 调用,我正在尝试将 API 调用重定向到 HTTPS,但是对于 HTTP 和 HTTPS 调用,我在 r.URL.Scheme 和 r.TLS 中得到一个 nil

func main() 
    r := mux.NewRouter()
    r.HandleFunc("/info", infoHandler).Methods("GET")   
    portString := fmt.Sprintf(":%s", getPorts())

    if cfenv.IsRunningOnCF() == true 
        r.Use(redirectTLS)
    

    if err := http.ListenAndServe(portString, r); err != nil 
        panic(err)
    



func redirectTLS(next http.Handler) http.Handler 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) 

        //if r.URL.Scheme != "https" 
        if r.TLS == nil 
            log.Info("Redirecting to HTTPS")
            //targetUrl := url.URLScheme: "https", Host: r.Host, Path: r.URL.Path, RawQuery: r.URL.RawQuery
            http.Redirect(w, r, "https://"+r.Host+r.RequestURI, http.StatusMovedPermanently)
            //http.Redirect(w, r, targetUrl, http.StatusMovedPermanently)
            return
        

        log.Info("Not Redirecting to HTTPS")
        next.ServeHTTP(w, r)
        return
    )

【问题讨论】:

您的监听器无法接收 https 请求,因为它没有使用 TLS。接收请求的侦听器应该知道它是如何配置的并且可以适当地重定向。 我的建议,这种服务使用 nginx 如果这是针对 Web 内容的,那是一回事,但如果它是针对 REST 调用的——那么不要费心做重定向——只是失败并出现适当的错误。 REST 的重定向是对资源的浪费。客户应该知道使用 https。 【参考方案1】:

如果应用程序直接为 HTTP 和 HTTPS 提供服务,则应用程序正在运行两个侦听器。配置在 HTTP 侦听器上运行的处理程序以重定向到 HTTPS。正常配置 HTTPS 处理程序:

// Redirect HTTP to HTTPS
go func() 
        log.Fatal(http.ListenAndServe(httpPort, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) 
    http.Redirect(w, r, "https://"+r.Host+r.RequestURI, http.StatusMovedPermanently)
    )))
    ()


// Run the application as normal on HTTPS.
r := mux.NewRouter()
r.HandleFunc("/info", infoHandler).Methods("GET")
log.Fatal(http.ListenAndServeTLS(httpsPport, certFile, keyFile, r))

没有必要用重定向器包装现有的处理程序,因为 HTTP 和 HTTPS 请求去不同的处理程序。

如果应用程序在反向代理之后运行,则将代理配置为将 HTTP 重定向到 HTTPS。

【讨论】:

以上是关于如何检查请求是通过 HTTP 还是 HTTPS [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道对 servlet 的请求是使用 HTTP 还是 HTTPS 执行的?

检查请求是 GET 还是 POST [重复]

如何判断 Magento 请求是针对前端页面还是后端页面?

如何知道请求是使用 HTTP 1.x 还是 HTTP2 执行的

检查请求是 GET 还是 POST

浏览器如何决定一个请求是用HTTP1还是HTTP2?