获取HTTP请求真实客户端IP地址
需要注意的是, X-Forwarded-For 的定义.
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// GetClientIP 获取HTTP请求真实客户端IP地址 // X-Real-IP: // 只包含客户端机器的一个IP, 如果为空, 某些代理服务器(Nginx)会填充此header. // X-Forwarded-For: client1, proxy1, proxy2, proxy3 // 一系列的IP地址列表, 通过一个 逗号+空格(", ") 把多个IP地址区分开, // 左边(client1)是最原始客户端的IP地址, // 代理服务器每成功收到一个请求, 就把请求来源IP地址添加到右边. // RemoteAddr: // 包含客户端的'真实IP地址', // 这是Web服务器从其接收连接并将响应发送到的实际物理IP地址. // 如果客户端通过代理连接, 它将提供'代理的IP地址'. func GetClientIP(r *http.Request) (string, error) { ip := r.Header.Get("X-Real-IP") if net.ParseIP(ip) != nil { return ip, nil } xff := r.Header.Get("X-Forwarded-For") for _, xff_ip := range strings.Split(xff, ", ") { i := strings.TrimSpace(xff_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") } |
.
【Go】获取HTTP请求真实客户端IP地址