Request.RemoteAddr
我有一个简单的 go 服务,它使用标准检查请求 IP 地址net/http 包。
该 go 服务部署在 nginx 后面,具有以下简单的位置配置:
location /api {
proxy_pass http://localhost:8080;
}
显然,当应用程序部署在代理后面时,Request.RemoteAddr
现在返回本地主机/服务器地址(例如::1
)
我知道我可以定义类似的东西:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
但这样做还需要修改 go 服务(如果服务部署为独立服务器,则需要进行一些额外的安全检查,因为这些标头可能会被客户端修改)
有没有办法将请求远程地址传递给go服务,以便可以返回Request.RemoteAddr
?
附注:在这种情况下,例如在带有 fastcgi 的 php 中,我可以执行以下操作:
fastcgi_param REMOTE_ADDR $remote_address;
答案1
您已向 Web 服务器提出了正确的配置更改。这些标头是将真实 IP 地址从 Web 服务器传递到应用服务器的方式,无论使用哪种语言。您应该将它们添加到您的server
或location
块中。
然后要在 Go 中接收这些数据,您可以使用如下中间件代理头来自 gorilla/handlers,它将把其中一个标头中的 IP 地址插入到 中Request.RemoteAddr
。您可能可以使用其他方法,但编程问题应该在 Stack Overflow 上询问。
答案2
由于相关的 Go 库是开源的,因此很容易检查出没有轻松定制的可能性Request.RemoteAddr
。
您可以摆脱 nginx,并将您的 go 服务放在 api.example.com(单独的非代理公共 IP 地址)下,而不是 example.com/api。