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

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

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

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

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


当前回答

我为此写了一个包。您可以将其用作表示中间件。我的软件包发布在这里:https://www.npmjs.com/package/express-ip

您可以使用

npm i express-ip

使用

const express = require('express');
const app = express();
const expressip = require('express-ip');
app.use(expressip().getIpInfoMiddleware);

app.get('/', function (req, res) {
    console.log(req.ipInfo);
});

其他回答

headers对象有你需要的一切,只需要这样做:

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

如果你在运行一个像NGiNX之类的代理,那么你应该检查'x-forward -for':

var ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress 

如果代理不是“你的”,我不会相信“x-forward -for”报头,因为它可能被欺骗。

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

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

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

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

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

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

我为此写了一个包。您可以将其用作表示中间件。我的软件包发布在这里:https://www.npmjs.com/package/express-ip

您可以使用

npm i express-ip

使用

const express = require('express');
const app = express();
const expressip = require('express-ip');
app.use(expressip().getIpInfoMiddleware);

app.get('/', function (req, res) {
    console.log(req.ipInfo);
});