獲取順序:
X-Real-IP
:只包含客戶端機器的一個IP,如果為空,某些代理服務器(如Nginx)會填充此header。
X-Forwarded-For
:一系列的IP地址列表,以,
分隔,每個經過的代理服務器都會添加一個IP。
RemoteAddr
:包含客戶端的真實IP地址。 這是Web服務器從其接收連接並將響應發送到的實際物理IP地址。 但是,如果客戶端通過代理連接,它將提供代理的IP地址。
RemoteAddr
是最可靠的,但是如果客戶端位於代理之后或使用負載平衡器或反向代理服務器時,它將永遠不會提供正確的IP地址,因此順序是先是X-REAL-IP
,然后是X-FORWARDED-FOR
,然后是 RemoteAddr
。 請注意,惡意用戶可以創建偽造的X-REAL-IP
和X-FORWARDED-FOR
標頭。
代碼實現:
// GetIP returns request real ip.
func GetIP(r *http.Request) (string, error) {
ip := r.Header.Get("X-Real-IP")
if net.ParseIP(ip) != nil {
return ip, nil
}
ip = r.Header.Get("X-Forward-For")
for _, i := range strings.Split(ip, ",") {
if net.ParseIP(i) != nil {
return i, nil
}
}
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
return "", err
}
if net.ParseIP(ip) != nil {
return ip, nil
}
return "", errors.New("no valid ip found")
}
參考鏈接:
https://golangbyexample.com/golang-ip-address-http-request/
https://github.com/polaris1119/goutils/blob/master/ip.go