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

使用Nginx代理Golang Gin框架时无法获取真实客户端IP怎么办?

解决Gin框架通过Nginx反向代理获取真实客户端IP的问题

1. 修正Nginx配置,添加标准反向代理IP头

在Nginx的location块中,补充行业标准的X-Forwarded-For头(用于传递真实客户端IP),也可以保留你原有的自定义IP头:

server {
   listen 80;
   listen [::]:80;
   location / {
        proxy_pass  http://127.0.0.1:3000;
        # 标准反向代理IP传递头,$proxy_add_x_forwarded_for会保留链路IP并追加当前客户端IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 保留原自定义头(可选)
        proxy_set_header X-Client-IP $remote_addr;
        proxy_set_header X-Appengine-Remote-Addr $remote_addr;
        add_header Access-Control-Allow-Origin *;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
    }
}

2. 修正Gin框架的代理信任配置

你当前误用了TrustedPlatform字段——这个字段是为Google App Engine、Heroku等特定云平台设计的,不适用于自定义反向代理场景。需要配置TrustedProxies来信任Nginx的IP(即127.0.0.1,因为请求从本地Nginx转发而来),这样Gin才会从X-Forwarded-For头解析真实IP:

func main() {
    r := gin.Default()
    // 信任本地Nginx的IP,允许Gin从X-Forwarded-For头读取真实客户端IP
    r.SetTrustedProxies([]string{"127.0.0.1"})
    // 若Nginx部署在其他服务器,需追加对应IP到TrustedProxies列表

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pongy",
            "client_ip": c.ClientIP(), // 现在可正确获取真实IP
        })
    })
    r.POST("/signup", controllers.SignUp)
    r.POST("/login", controllers.Login)
    r.GET("/validation", middleware.RequireAuth, controllers.Validation)
    r.Run("127.0.0.1:3000")
}

3. 关键逻辑说明

  • ctx.RemoteIP():仅返回直接建立TCP连接的IP(即Nginx的127.0.0.1),不会读取任何HTTP头,因此无法拿到真实客户端IP。
  • ctx.ClientIP():如果请求来源IP在TrustedProxies列表中,会从X-Forwarded-For头提取最左侧的非信任IP作为真实客户端IP;否则返回RemoteIP()的结果。
  • 若坚持使用自定义X-Client-IP头,可直接通过c.GetHeader("X-Client-IP")读取,但需确保Nginx正确传递该头,同时通过TrustedProxies限制仅信任Nginx的请求,避免IP伪造风险。

验证方式

在/ping接口返回c.ClientIP()的值,用非本地网络(比如手机流量)访问服务器公网IP,检查返回的IP是否为真实客户端IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:25:24