首頁  >  文章  >  後端開發  >  一文分析go中判斷請求是http還是https

一文分析go中判斷請求是http還是https

藏色散人
藏色散人轉載
2023-03-02 17:11:023636瀏覽

這篇文章為大家帶來了關於go的相關知識,其中主要給大家聊聊golang中判斷請求是http還是https(用於獲取當前訪問地址),有興趣的朋友一起來看一下吧,希望對大家有幫助。

golang中判斷請求是http還是https-用於取得目前存取位址

#一個自由職業獨立開發者,線上客服系統的開發日誌

今天為客服系統增加了一個配置,配置企業微信內部群通知機器人webhook,當有新消息到來的時候,調用webhook,推送給企業微信群。新消息的內容裡,支持 markdown,可以帶鏈接,就想把當前網址的鏈接帶過去,方便直接點擊後去回复消息。下面是涉及的技術知識點總結。

未使用nginx 等反向代理的情況下

那麼可以直接使用下面的程式碼來確認,http.Request 結構體的TLS 欄位判斷請求是否使用了HTTPS 協定。如果該欄位不為nil,則說明請求使用了HTTPS 協定;否則,說明請求使用了HTTP 協定

package main
import (
    "fmt"
    "net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
    if r.TLS != nil {
        fmt.Println("HTTPS request")
    } else {
        fmt.Println("HTTP request")
    }
}
func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

#經過反向代理程式的情況下

##上面的程式碼失效,可以使用下面方法

如果使用了nginx 反向代理,那麼需要確保反代中傳入了下面的headers 參數X-Forwarded-Proto

location / {
    proxy_pass http://your_upstream_server;
    proxy_set_header X-Forwarded-Proto $scheme;
}

可以判斷這個header 來確認是否https

package main
import (
    "fmt"
    "net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
    proto := r.Header.Get("X-Forwarded-Proto")
    if proto == "https" {
        fmt.Println("HTTPS request")
    } else {
        fmt.Println("HTTP request")
    }
}
func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

綜合一下,取得目前存取位址的函數

//获取当前访问的Host
func GetHost(r *http.Request) (Url string) {
    scheme := "http://"
    if r.TLS != nil || r.Header.Get("X-Forwarded-Proto") == "https" {
        scheme = "https://"
    }
    return strings.Join([]string{scheme, r.Host}, "")}

【相關推薦:

Go影片教學# 】

以上是一文分析go中判斷請求是http還是https的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除