为了解决这个问题,通常需要检查 HTTP 请求头中的 X-Forwarded-For
、X-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 头部的方法都有可能被伪造,因此在安全敏感的应用中应该谨慎使用。