golang中判斷請求是http還是https獲取當(dāng)前訪問地址
在線客服系統(tǒng)的開發(fā)日志
今天給客服系統(tǒng)增加了一項配置,配置企業(yè)微信內(nèi)部群通知機(jī)器人 webhook,當(dāng)有新消息到來的時候,調(diào)用 webhook,推送給企業(yè)微信群。新消息的內(nèi)容里,支持 markdown,可以帶鏈接,就想把當(dāng)前網(wǎng)址的鏈接帶過去,方便直接點擊后去回復(fù)消息。下面是涉及的技術(shù)知識點總結(jié)。
未使用 nginx 等反向代理的情況下
那么可以直接使用下面的代碼來確認(rèn),http.Request 結(jié)構(gòu)體的 TLS 字段判斷請求是否使用了 HTTPS 協(xié)議。如果該字段不為 nil,則說明請求使用了 HTTPS 協(xié)議;否則,說明請求使用了 HTTP 協(xié)議
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)
}經(jīng)過反向代理的情況下
上面的代碼失效,可以使用下面方法
如果使用了 nginx 反向代理,那么需要確保反代中傳入了下面的 headers 參數(shù) X-Forwarded-Proto
location / {
proxy_pass http://your_upstream_server;
proxy_set_header X-Forwarded-Proto $scheme;
}可以判斷這個 header 來確認(rèn)是否 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)
}綜合一下,獲取當(dāng)前訪問地址的函數(shù)
//獲取當(dāng)前訪問的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}, "")
}另外,有客服系統(tǒng)需求的同學(xué),可以訪問下面地址研究測試
gofly.v1kf.com
以上就是golang中判斷請求是http還是https獲取當(dāng)前訪問地址的詳細(xì)內(nèi)容,更多關(guān)于golang判斷請求訪問地址的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang實現(xiàn)事務(wù)型內(nèi)存數(shù)據(jù)庫的方法詳解
內(nèi)存數(shù)據(jù)庫經(jīng)我們經(jīng)常用到,例如Redis,那么如何從零實現(xiàn)一個內(nèi)存數(shù)據(jù)庫呢,本文旨在介紹如何使用Golang編寫一個KV內(nèi)存數(shù)據(jù)庫MossDB2023-03-03
Go語言實現(xiàn)高并發(fā)百萬QPS的關(guān)鍵技術(shù)棧
Go語言憑借其輕量級goroutine和高效的調(diào)度器,天然適合高并發(fā)場景,Go語言通過Goroutine調(diào)度優(yōu)化、I/O多路復(fù)用等技術(shù)實現(xiàn)高并發(fā),結(jié)合性能調(diào)優(yōu)與架構(gòu)設(shè)計,可支撐百萬QPS,延遲低于5ms,支持未來擴(kuò)展2025-05-05
golang1.23版本之前 Timer Reset方法無法正確使用
在Go 1.23之前,使用`time.Reset`函數(shù)時需要先調(diào)用`Stop`并明確從timer的channel中抽取出東西,以避免潛在的問題,然而,這在實際代碼中難以實現(xiàn),因為設(shè)置定時器狀態(tài)和發(fā)送channel的操作并不是原子的,在某些情況下,這會導(dǎo)致timer在不應(yīng)該觸發(fā)時提前觸發(fā)2025-01-01

