package utils import ( "net" "net/http" "strings" ) // 注意,相关 ip 获取未做反向代理安全判断,可能导致安全降级 func GetRemoteIP(r *http.Request) string { // 最先取 cloudflare 的头 if ip := r.Header.Get("CF-Connecting-IP"); ip != "" { return ip } if forwardedFor := r.Header.Get("X-Forwarded-For"); forwardedFor != "" { ips := strings.Split(forwardedFor, ",") if len(ips) > 0 { return strings.TrimSpace(ips[0]) } } if realIP := r.Header.Get("X-Real-IP"); realIP != "" { return realIP } ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { return r.RemoteAddr } return ip }