我目前正在尝试获取所请求用户的IP。问题是IP返回的是::ffff:127.0.0.1而不是127.0.0.1。我尝试使用trusted proxy选项(尽管不使用代理),req.ips是空的。使用4.x Express.js。
router.get('/', function(req, res, next) {
console.log('ip', req.ip)
res.send({})
});发布于 2015-11-18 21:05:34
::ffff:是放置在IPv4 (128位)空间内的IPv4 (32位)地址的子网前缀。IPv6分为两个部分:子网前缀和接口后缀。每一组有64位长,或4组,由4个十六进制字符组成。
在IPv6中,允许移除前导零,然后删除连续零,这意味着::ffff:实际上将转换为0000:0000:ffff:0000,此地址已被指定为IPv4 to IPv6子网前缀,因此任何IPv6处理器都将理解它正在处理IPv4地址并相应地处理它。
在不久的将来,IP地址都将是IPv6,这是因为我们几乎没有数字(42亿,减去一些misc的空间)。)在IPv4地址空间中。
IPv6允许一个更大的空间。比尔·盖茨( Bill )在IPv6上发表讲话时表示:“340个十万个十万个应该足以满足任何人的需求。”
开始使用IPv6命名空间寻址IP地址非常重要,因此在代码中包含::ffff:,因为将来这些冒号之间将有真正的十六进制数据。如果出于美观的原因,您的代码会在切换到IPv6网络或遇到IPv6地址时中断。
一些网络目前正在运行IPv6,您很快就会遇到IPv6 IP地址;现在就跳下去,否则将来可能会破坏您的代码。
TL;DR (短)版本的问题是:一切都很好。不要更改它,它是IPv6版本的IPv4地址。


如果要使代码与IPv6兼容,只需检查::ffff:前缀.如果它存在,移除它并以IPv4的形式处理其余的.如果::ffff:不存在,则它是一个IPv6地址,需要按此方式处理。您可以通过查看句点是否在字符串中来反复检查,如果是,则为IPv4。
记住,除了你需要对IP地址所做的调整之外,你只是在记录IP,对吗?对于解析器和日志聚合来说,这将是非常重要的,以期待将来的::ffff:127.0.0.1等。除非你需要改变一个IP,就把它当作你收到的东西吧。
发布于 2016-09-13 14:54:56
这似乎是ipv6的一个怪癖:对于ipv4地址,ipv6似乎将ipv6符号与ipv4符号混合在一起。
为了以简单、不混合的方式获取ipv4和ipv6地址,我使用:
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
if (ip.substr(0, 7) == "::ffff:") {
ip = ip.substr(7)
}发布于 2018-10-09 15:04:27
如果您只需要IPv4,可以强制节点服务器使用IPv4侦听。
用于快速应用程序编辑/bin/www
变化
server.listen(port);至
server.listen(port, '0.0.0.0');至少对我有用。
https://stackoverflow.com/questions/29411551
复制相似问题