You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言中使用gorilla/mux获取客户端IP地址

Go 使用gorilla/mux开发时获取客户端IP的实现方案

r.UserAgent() 用于获取客户端的设备/浏览器标识,本身就不包含IP信息,自然无法拿到目标结果,你可以按照以下两种场景适配实现:

1. 无反向代理的直连场景

如果服务直接对外暴露、没有前置Nginx/CDN等代理服务,直接从http.Request的RemoteAddr字段提取即可:

import "net"

func GetIpAddress(w http.ResponseWriter, r *http.Request){
    // RemoteAddr默认格式为 IP:端口,拆分后取IP部分
    ip, _, err := net.SplitHostPort(r.RemoteAddr)
    if err != nil {
        ip = r.RemoteAddr
    }
    fmt.Print("客户端IP: ", ip)
}

2. 有反向代理的场景

如果服务前置了代理服务,RemoteAddr拿到的会是代理服务器的本地IP,需要从代理服务注入的请求头中提取真实IP,优先取X-Real-IP、其次取X-Forwarded-For的第一个值,都不存在时回退到RemoteAddr即可:

import (
    "net"
    "strings"
    "net/http"
)

func GetClientIP(r *http.Request) string {
    // 优先取代理注入的X-Real-IP
    ip := r.Header.Get("X-Real-IP")
    if net.ParseIP(ip) != nil {
        return ip
    }
    // 其次取X-Forwarded-For最左侧的原始客户端IP
    xff := r.Header.Get("X-Forwarded-For")
    if xff != "" {
        ips := strings.Split(xff, ",")
        for i := range ips {
            ip = strings.TrimSpace(ips[i])
            if net.ParseIP(ip) != nil {
                return ip
            }
        }
    }
    // 回退到直连场景的取值
    ip, _, err := net.SplitHostPort(r.RemoteAddr)
    if err != nil {
        return r.RemoteAddr
    }
    return ip
}

func GetIpAddress(w http.ResponseWriter, r *http.Request){
    clientIP := GetClientIP(r)
    fmt.Print("客户端真实IP: ", clientIP)
}

注意:如果使用反向代理,需要提前在代理服务中配置X-Real-IP、X-Forwarded-For头的注入规则,公网服务建议仅信任来自已备案代理服务的请求头,避免用户伪造请求头传递虚假IP。

内容的提问来源于stack exchange,提问作者user13128707

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:15:01