Golang獲取HTTP請求IP


獲取順序:

  • 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-IPX-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM