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