为了解决这个问题,通常需要检查 HTTP 请求头中的 X-Forwarded-ForX-Real-IP 或其他相关的头部字段,这些字段可能会被代理服务器设置为包含原始请求的 IP 地址。以下是一些处理方法:

    直接使用 RemoteAddr: 如果没有使用代理,可以直接从 RemoteAddr 获取 IP 地址。

    ip, _, err := net.SplitHostPort(r.RemoteAddr)
    if err != nil {
       log.Fatal(err)
    }
    

    检查 X-Forwarded-For 请求头: 这个头部可能包含一个或多个 IP 地址,通常第一个 IP 地址是客户端的真实 IP。

    ip := r.Header.Get("X-Forwarded-For")
    if ip == "" {
       ip = strings.Split(r.RemoteAddr, ":")[0]
    }
    

    检查 X-Real-IP 请求头: 这个头部通常包含客户端的真实 IP 地址。

    ip := r.Header.Get("X-Real-IP")
    if ip == "" {
       ip = strings.Split(r.RemoteAddr, ":")[0]
    }
    

    使用第三方库: 例如 github.com/netinternet/remoteaddr,可以简化从请求中获取真实 IP 地址的过程。

    ip, port := remoteaddr.Parse().IP(r)
    

如果你的应用程序部署在如 Nginx 这样的反向代理后面,你需要在 Nginx 配置中添加相应的头部字段,以便正确地传递客户端的真实 IP 地址。例如,在 Nginx 配置中,你可以这样设置:

location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://your_backend_server;
}

在实际应用中,你可能需要结合你的部署环境和安全要求来选择合适的方法。记得,任何基于 HTTP 头部的方法都有可能被伪造,因此在安全敏感的应用中应该谨慎使用。