這篇文章為大家帶來了關於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-Protolocation / { 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中文網其他相關文章!