目录

一:三种获取IP含义

二:获取优先级

三:直接上代码


一:三种获取IP含义

  • X-Real-IP:只包含客户端机器的一个IP,如果为空,某些代理服务器(如Nginx)会填充此header。
  • X-Forwarded-For:一系列的IP地址列表,以,分隔,每个经过的代理服务器都会添加一个IP。
  • RemoteAddr:包含客户端的真实IP地址。 这是Web服务器从其接收连接并将响应发送到的实际物理IP地址。 但如果客户端通过代理连接,它将提供代理的IP地址。

二:获取优先级

X-REAL-IP >  X-FORWARDED-FOR > RemoteAddr

注意📢:RemoteAddr是最可靠的,但是如果客户端位于代理之后或使用负载平衡器或反向代理服务器时,它将永远不会提供正确的IP地址,因此顺序是先是X-REAL-IP,然后是X-FORWARDED-FOR,然后是 RemoteAddr。 注意的是恶意用户可以创建伪造的X-REAL-IP和X-FORWARDED-FOR标头(因为可以人为的放入header中)。

三:直接上代码

import (
	"net"
	"net/http"
)
 
// GetRemoteClientIp 获取远程客户端IP
func GetRemoteClientIp(r *http.Request) string {
	remoteIp := r.RemoteAddr
 
	if ip := r.Header.Get("X-Real-IP"); ip != "" {
		remoteIp = ip
	} else if ip = r.Header.Get("X-Forwarded-For"); ip != "" {
		remoteIp = ip
	} else {
		remoteIp, _, _ = net.SplitHostPort(remoteIp)
	}
 
	//本地ip
	if remoteIp == "::1" {
		remoteIp = "127.0.0.1"
	}
 
	return remoteIp
}