| 123456789101112131415161718192021222324252627282930313233343536 |
- 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
- }
|