设置https后获取客户端真实ip

2018.12.11 23:51 阅读 362

记自己犯下的一个错误。又到了深夜,做的过程中总是遇到一些难以预料的错误,不知道如何解决,百度、Google各种找寻答案。最后在一次又一次的错误中找到正确答案。

服务端获取客户端ip地址

const ip = (req.headers['x-forwarded-for']
      || req.headers['x-real-ip']
      || (req.connection && req.connection.remoteAddress)
      || req.socket.remoteAddress
      || (req.connection && req.connection.socket.remoteAddress)
      || req.ip
      || req.ips[0]
      || ''
    ).replace('::ffff:', '')

其中不走代理,也就是直接请求ip地址的情况下req.socket.remoteAddressreq.ip都是客户端的真实ip。

代理情况下

当把ajax请求的ip代理到域名下的时候,req.socket.remoteAddressreq.ip就获取到的客户端ip,获取到的是本地ip127.0.0.1

这时需要配置nginx来获取客户端真实ip。

配置nginx获取客户端真实ip

在请求接口的域名代理上添加proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;整体具体代码如下

server {
    listen       80;
    listen       443 ssl http2;
    server_name  api.kkfor.com;
    #省略其他部分

    location / {
        proxy_pass          http://127.0.0.1:5000;
        # 添加下面一行,设置请求头 x-forwarded-for
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

添加了请求头代理信息,req.headers['x-forwarded-for']就可以获取到客户端的真实ip。

总结

默认情况直接请求域名地址,不走代理,可以获取到真实ip。将域名地址代理到域名上之后,就会获取不到客户端真实ip,需要设置proxy_set_header内容。

设置的时候要看清域名,不要错误的在页面域名上添加proxy_set_header

由于博主一开始错误的在kkfor.com下添加proxy_set_header,导致尝试了很多次都不能获取正确ip,夜已深了,晚安!