ip.go 765 B

123456789101112131415161718192021222324252627282930313233343536
  1. package utils
  2. import (
  3. "net/http"
  4. "strings"
  5. )
  6. // 获取真实IP地址
  7. func GetRealIP(r *http.Request) string {
  8. // 尝试从 X-Real-IP 获取
  9. if ip := r.Header.Get("X-Real-IP"); ip != "" {
  10. return ip
  11. }
  12. // 尝试从 X-Forwarded-For 获取
  13. if ip := r.Header.Get("X-Forwarded-For"); ip != "" {
  14. // X-Forwarded-For 可能包含多个 IP,第一个是真实 IP
  15. ips := strings.Split(ip, ",")
  16. if len(ips) > 0 {
  17. return strings.TrimSpace(ips[0])
  18. }
  19. }
  20. // 尝试从 RemoteAddr 获取
  21. ip := r.RemoteAddr
  22. // RemoteAddr 包含端口号,需要去除
  23. if colonIndex := strings.LastIndex(ip, ":"); colonIndex != -1 {
  24. ip = ip[:colonIndex]
  25. }
  26. // 去除 IPv6 的中括号
  27. ip = strings.TrimPrefix(ip, "[")
  28. ip = strings.TrimSuffix(ip, "]")
  29. return ip
  30. }