从request.connection.remoteAddress nodejs剥离“:: ffff:”前缀

我正在使用nodejs(express)实现订阅/响应的可能性。 当访问者发送请求时,除请求内的其他参数(端口,时间间隔等)外,我将收集ip以便能够不时地发送对该ip的响应。

我正在使用访问访客的IP地址:

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

基于如何使用Node.js获取用户的IP地址?

要点是,我得到IP后,我有这样的:“:: ffff:192.168.1.10”(解释在request.connection.remoteAddress现在前缀在:: ffff在node.js )

我正在磨合,为了得到ip地址,我只能用“:: ffff:”前缀“安全”,以便通过http响应来回复,或者我在这里丢失了其他东西,那不是我应该做的?

是的,剥离是安全的。 这是一个快速的方法来做到这一点。

 address.replace(/^.*:/, '') 

您的操作系统正在使用混合IPv4-IPv6套接字进行监听,该套接字将IPv4地址转换为IPv6,并将其embedded到IPv4映射的IPv6地址格式中 。 这种格式只是在IPv4地址前加上:ffff: ,所以你可以通过:ffff:来恢复原来的IPv4地址。 (一些不赞成的映射前缀与::而不是:ffff: /^.*:/所以我们使用正则expression式/^.*:/来匹配这两种forms。

如果您不确定传入的IPv6地址是否来自IPv4,则可以先检查它是否与IPv6映射模板匹配:

 template = /^:(ffff)?:(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/ has_ipv4_version = template.test(address) 
 app.post('/xyz',function(request,response) { var IPFromRequest=request.connection.remoteAddress; var indexOfColon = IPFromRequest.lastIndexOf(':'); var IP = IPFromRequest.substring(indexOfColon+1,IPFromRequest.length); console.log(IP); }); 

这个节点代码…

返回ipv6到ipv4如果ipv6地址实际上是一个映射的ipv4地址,否则它返回一个规范化的ipv6地址,否则它只是返回它原来的ipstring

 var ip = (function (req) { var ipaddr = require('ipaddr.js'); var ipString = (req.headers["X-Forwarded-For"] || req.headers["x-forwarded-for"] || '').split(',')[0] || req.connection.remoteAddress; if (ipaddr.isValid(ipString)) { try { var addr = ipaddr.parse(ipString); if (ipaddr.IPv6.isValid(ipString) && addr.isIPv4MappedAddress()) { return addr.toIPv4Address().toString(); } return addr.toNormalizedString(); } catch (e) { return ipString; } } return 'unknown'; }(req)); 

https://www.npmjs.com/package/ipaddr.js

https://github.com/whitequark/ipaddr.js

有同样的问题…即时通讯也新的JavaScript,但我解决了这个.slice

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

如果你想获得IPv4的IP地址,你可以使用:

 http.createServer(callback).listen(port, '0.0.0.0'); 

那么,你会得到你想要的

 req.connection.remoteAddress // 192.168.1.10 

这里是nodejs的相关文档

req.connection.remoteAddress.substring(7,req.connection.remoteAddress.length)