在egg项目上线中,开发时使用 this.ctx.request.ip 就可以获取到ip地址,但是使用nginx代理过后用这个方法就获取不到客户端真实ip了,而是拿到的是代理服务器的ip地址
那么我们应该怎么才能在Nginx代理情况下获取客户端真实IP地址呢?
下面就是如何在使用Nginx代理的情况下获取客户端真实IP的解决办法,其实也比较简单。
Nginx配置
server
{
listen 80;
listen [::]:80;
server_name xxx.xxx.com xxx.xxxx.cn;
location / {
proxy_pass http://localhost:7001;
#保留代理之前的host 包含客户端真实的域名和端口号
proxy_set_header Host $host;
#保留代理之前的真实客户端ip
proxy_set_header X-Real-IP $remote_addr;
#这个Header和X-Real-IP类似,但它在多级代理时会包含真实客户端及中间每个代理服务器的IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#表示客户端真实的协议(http还是https)
proxy_set_header X-Forwarded-Proto $scheme;
#指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
#如果使用"default"参数,将根据location和proxy_pass参数的设置来决定。
#proxy_redirect [ default|off|redirect replacement ];
proxy_redirect off;
}
}
获取真实ip
我们打印一下 this.ctx.request 得到一下结果
{
method: 'GET',
url: 'xxx/109',
header:
{
host: 'xxx.xxx.com',
'x-real-ip': 'xxx.xxx.xxx.xx',
'x-forwarded-for': 'xxx.xxx.xxx.xx',
'x-forwarded-proto': 'http',
connection: 'close',
'upgrade-insecure-requests': '1',
'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
accept:
'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
referer: 'http://xxxx.xxxxx.com/',
'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
cookie:
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
}
}
这样我们就可以通过 x-real-ip x-forwarded-for 获取真实ip
const ip = this.ctx.request.header['x-real-ip']||this.ctx.request.header['x-forwarded-for'];
标签:真实,nginx,ip,xxx,header,proxy,客户端
From: https://www.cnblogs.com/Lmyong/p/16820640.html