Golang使用RemoteAddr()获取远程主机地址的注意事项

马谦马谦马谦 2018年1月18日21:38:06 发表评论

一、问题描述

http.Request下的方法RemoteAddr()可以获取客户端的地址和端口号,最近的一个项目中用到了这个方法。

使用过程中一直都没有什么问题,但是当项目上线之后就发现不管怎么获取ip,客户端地址都是127.0.0.1

对于这个问题一直百思不得其解,最后搞了半天才发现是nginx的原因。

因为线上项目使用nginx做了反向代理,所以导致服务端每次获取的都是nginx的地址,即127.0.0.1

关于这个问题的具体的内容可以查看:HTTP协议中的X-Real-IP, X-Forwarded-For和remote_addr头

二、解决方法

当http请求不存在代理的时候,使用这个方法时没有问题的,但是在有代理的情况下,就只能通过其他的方法来获取了。

如果是nginx,可以在代理的代码块加上以下代码:

在nginx转发前把真实地址设置到X-Real-IPX-Forwarded-For两个请求头上,然后根据需要再从它们的值获取。

本文共执行43次查询,耗时0.270秒!
马谦马谦马谦

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: