首頁 > 後端開發 > Golang > 主體

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

藏色散人
發布: 2023-03-02 19:56:18
轉載
3660 人瀏覽過

這篇文章為大家帶來了關於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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板