package utils import ( "net/http" "strings" ) // 获取真实IP地址 func GetRealIP(r *http.Request) string { // 尝试从 X-Real-IP 获取 if ip := r.Header.Get("X-Real-IP"); ip != "" { return ip } // 尝试从 X-Forwarded-For 获取 if ip := r.Header.Get("X-Forwarded-For"); ip != "" { // X-Forwarded-For 可能包含多个 IP,第一个是真实 IP ips := strings.Split(ip, ",") if len(ips) > 0 { return strings.TrimSpace(ips[0]) } } // 尝试从 RemoteAddr 获取 ip := r.RemoteAddr // RemoteAddr 包含端口号,需要去除 if colonIndex := strings.LastIndex(ip, ":"); colonIndex != -1 { ip = ip[:colonIndex] } // 去除 IPv6 的中括号 ip = strings.TrimPrefix(ip, "[") ip = strings.TrimSuffix(ip, "]") return ip }