获取远程IP地址时,使用nginx代理为Glang Gin?

0lvr5msh  于 2022-12-11  发布在  Nginx
关注(0)|答案(1)|浏览(276)

我使用Nginx作为golang API应用程序的代理,该应用程序使用go gin框架
Nginx配置很简单

server {
   listen 80;
   listen [::]:80;
   location / {
        proxy_pass  http://127.0.0.1:3000;
        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;
    }
}

Go代码将IP地址存储到数据库中

ctx.RemoteIP()

要获取IP,问题是它总是存储127.0.0.1,而从不获取真实的请求的IP
我切换到另一个功能

ctx.ClientIP()

同样的问题,它存储127.0.0.1而不是请求IP
在这两种方法中,我都将可信代理设置为“X-Client-IP”

func main() {
    r := gin.Default()
    r.TrustedPlatform = "X-Client-IP"
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pongy",
        })
    })
    r.POST("/signup", controllers.SignUp)
    r.POST("/login", controllers.Login)
    r.GET("/validation", middleware.RequireAuth, controllers.Validation)
    r.Run("127.0.0.1:3000") // listen and serve on 0.0.0.0:8080
}
2lpgd968

2lpgd9681#

我相信你想做两件事来解决这个问题。
首先,将信头名称从X-Client-IP变更为X-Real-IPX-Forwarded-For
然后,将localhost设置为受信任的代理,如下所示:
r.SetTrustedProxies([]string{"127.0.0.1", "::1"})
用上面的代码替换r.TrustedPlatform = "X-Client-IP"行,对ctx.ClientIP()的调用应该返回所需的内容。
你可以在Gin源代码中看到它正在寻找这两个头文件名。

相关问题