如何在Go语言中使用gorilla/mux获取客户端IP地址
Go 使用gorilla/mux开发时获取客户端IP的实现方案
r.UserAgent() 用于获取客户端的设备/浏览器标识,本身就不包含IP信息,自然无法拿到目标结果,你可以按照以下两种场景适配实现:
1. 无反向代理的直连场景
如果服务直接对外暴露、没有前置Nginx/CDN等代理服务,直接从http.Request的RemoteAddr字段提取即可:
import "net" func GetIpAddress(w http.ResponseWriter, r *http.Request){ // RemoteAddr默认格式为 IP:端口,拆分后取IP部分 ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { ip = r.RemoteAddr } fmt.Print("客户端IP: ", ip) }
2. 有反向代理的场景
如果服务前置了代理服务,RemoteAddr拿到的会是代理服务器的本地IP,需要从代理服务注入的请求头中提取真实IP,优先取X-Real-IP、其次取X-Forwarded-For的第一个值,都不存在时回退到RemoteAddr即可:
import ( "net" "strings" "net/http" ) func GetClientIP(r *http.Request) string { // 优先取代理注入的X-Real-IP ip := r.Header.Get("X-Real-IP") if net.ParseIP(ip) != nil { return ip } // 其次取X-Forwarded-For最左侧的原始客户端IP xff := r.Header.Get("X-Forwarded-For") if xff != "" { ips := strings.Split(xff, ",") for i := range ips { ip = strings.TrimSpace(ips[i]) if net.ParseIP(ip) != nil { return ip } } } // 回退到直连场景的取值 ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { return r.RemoteAddr } return ip } func GetIpAddress(w http.ResponseWriter, r *http.Request){ clientIP := GetClientIP(r) fmt.Print("客户端真实IP: ", clientIP) }
注意:如果使用反向代理,需要提前在代理服务中配置
X-Real-IP、X-Forwarded-For头的注入规则,公网服务建议仅信任来自已备案代理服务的请求头,避免用户伪造请求头传递虚假IP。
内容的提问来源于stack exchange,提问作者user13128707
相关产品推荐
相关产品推荐

