我不完全明白我应该如何获得一个远程用户IP地址。

假设我有一个简单的请求路由,如:

app.get(/, function (req, res){
   var forwardedIpsStr = req.header('x-forwarded-for');
   var IP = '';

   if (forwardedIpsStr) {
      IP = forwardedIps = forwardedIpsStr.split(',')[0];  
   }
});

上面的方法是否正确,以获得真实的用户IP地址或有更好的方法? 那么代理呢?


当前回答

这只是这个答案的附加信息。

如果你正在使用nginx,你需要添加proxy_set_header X-Real-IP $remote_addr;到站点的位置块。例如:/etc/nginx/sites-available/www.example.com。下面是一个服务器块示例。

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    location / {
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_pass http://127.0.1.1:3080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

重新启动nginx后,你将能够使用req访问你的节点/express应用程序路由中的ip。headers['x-real-ip'] || req.connection.remoteAddress;

其他回答

这对我来说比其他方法更有效。我的网站在CloudFlare后面,它似乎需要cf- connection -ip。

req.headers['cf-connecting-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress

没有测试代理后面的Express,因为它没有说任何关于这个cf- connection -ip头。

添加app.set('信任代理',true) 使用要求。IP或req。Ips和往常一样

我知道这个问题已经有了答案,但下面是我如何让我的问题起作用的。

let ip = req.connection.remoteAddress.split(`:`).pop();

var ip = req.connection.remoteAddress;

IP = IP .split(':')[3];

在我的案例中,类似于这个解决方案,我最终使用了以下x-forward for方法:

let ip = (req.headers['x-forwarded-for'] || '').split(',')[0];

x-forward -for报头将继续添加从源服务器到最终目标服务器的IP路由,因此如果需要检索源客户端的IP,这将是数组的第一项。