123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package utilx
- import (
- "net"
- "net/http"
- "strings"
- )
- // ClientIP 获取客户端ip
- func ClientIP(r *http.Request) string {
- xForwardedFor := r.Header.Get("X-Forwarded-For")
- ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
- if ip != "" {
- return ip
- }
- ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
- if ip != "" {
- return ip
- }
- if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
- return ip
- }
- return ""
- }
- func GetUserAgent(req *http.Request) string {
- return req.Header.Get("User-Agent")
- }
- // 检测IP地址是否为内网IP
- func IpIsInternal(ip string) bool {
- if ip == "" {
- return false
- }
- rip := net.ParseIP(ip)
- // 检查是否位于私有IP范围内
- privateRanges := []string{
- "10.0.0.0/8",
- "172.16.0.0/12",
- "192.168.0.0/16",
- "169.254.0.0/16", // 链路本地
- "127.0.0.0/8", // 本地回环
- "::1/128", // IPv6 本地回环
- "fe80::/10", // IPv6 链路本地
- "fc00::/7",
- }
- for _, r := range privateRanges {
- _, network, _ := net.ParseCIDR(r)
- if network.Contains(rip) {
- return true
- }
- }
- return false
- }
- // DirectClientIP 直接获取客户端ip
- func DirectClientIP(r *http.Request) string {
- if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
- return ip
- }
- return ""
- }
|