如何在节点中确定用户的IP地址

我怎样才能确定控制器内的给定请求的IP地址? 例如(快递):

app.post('/get/ip/address', function (req, res) { // need access to IP address here }) 

在你的request对象中有一个叫做connection的属性,它是一个net.Socket对象。 net.Socket对象有一个属性remoteAddress ,因此你应该能够通过这个调用获得IP:

 request.connection.remoteAddress 

请参阅http和net的文档

编辑

正如@juand在注释中指出的,如果服务器位于代理之后,获取远程IP的正确方法是request.headers['x-forwarded-for']

 var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || (req.connection.socket ? req.connection.socket.remoteAddress : null); 

请注意,有时您可以在req.headers['x-forwarded-for']获取多个IP地址。

该领域的一般格式是:

x-forwarded-for: client, proxy1, proxy2, proxy3

其中值是以逗号+空格分隔的IP地址列表,最左边的是原始客户端,并且每个通过请求的连续代理添加接收请求的IP地址。 在这个例子中,请求通过了proxy1proxy2 ,然后是proxy3proxy3显示为请求的远程地址。

这是Arnav Gupta提出的解决scheme:

 var ip = req.headers['x-forwarded-for'].split(',').pop() || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress 

您可以保持DRY ,只使用支持IPv4IPv6的 节点-ipware

安装:

 npm install ipware 

在你的app.js或中间件中:

 var getIP = require('ipware')().get_ip; app.use(function(req, res, next) { var ipInfo = getIP(req); console.log(ipInfo); // { clientIp: '127.0.0.1', clientIpRoutable: false } next(); }); 

它会尝试获取用户的IP地址或返回127.0.0.1来表示无法确定用户的IP地址。 查看高级选项的README文件。

您可以使用request-ip来检索用户的IP地址。 它处理了不less边缘情况,其中一些在其他答案中提到。

披露:我创build了这个模块

安装:

 npm install request-ip 

在你的应用程序:

 var requestIp = require('request-ip'); // inside middleware handler var ipMiddleware = function(req, res, next) { var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1 next(); }; 

希望这可以帮助

以下函数涵盖了所有的情况将有所帮助

 var ip; if (req.headers['x-forwarded-for']) { ip = req.headers['x-forwarded-for'].split(",")[0]; } else if (req.connection && req.connection.remoteAddress) { ip = req.connection.remoteAddress; } else { ip = req.ip; }console.log("client IP is *********************" + ip); 

如果使用快递…

req.ip

我正在看这个,然后我就像等待,我用快递。 咄。

request.headers['x-forwarded-for'] || request.connection.remoteAddress

如果x-forwarded-for头在那里,那么使用它,否则使用.remoteAddress属性。

x-forwarded-for标头被添加到通过为HTTPHTTPS设置的负载平衡器(或其他types的代理)的请求(当使用代理协议TCP层进行平衡时,也可以将此标头添加到请求中)。 这是因为request.connection.remoteAddress属性将包含负载均衡器的私有IP地址,而不是客户端的公有IP地址。 通过使用OR语句,按照上面的顺序,检查是否存在x-forwarded-for标头,如果存在则使用它,否则使用request.connection.remoteAddress

如果您使用Express版本3.x或更高版本,则可以使用信任代理设置( http://expressjs.com/api.html#trust.proxy.options.table ),它会将地址链x-forwarded-for标题,并将最新的IP链放在你没有被configuration为可信代理的链上,放到req对象的ip属性中。

 function getCallerIP(request) { var ip = request.headers['x-forwarded-for'] || request.connection.remoteAddress || request.socket.remoteAddress || request.connection.socket.remoteAddress; ip = ip.split(',')[0]; ip = ip.split(':').slice(-1); //in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx" return ip; } 

如果你有多个IP,这对我有用:

 var ipaddress = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress).split(",")[0]; 

简单的在nodejs中获得远程ip:

 var ip = req.header('x-forwarded-for') || req.connection.remoteAddress; 

有同样的问题…即时通讯也新的JavaScript,但我解决了这个req.connection.remoteAddress; 那给了我第IP地址(但在ipv6格式:: ffff.192.168.0.101)然后.slice删除7个第一个数字。

 var ip = req.connection.remoteAddress; if (ip.length < 15) { ip = ip; } else { var nyIP = ip.slice(7); ip = nyIP; }