我目前正在尝试获取所请求用户的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({})
});
我目前正在尝试获取所请求用户的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({})
});
req.ip
,只是req.ips
作为测试而尝试。我只是不确定是什么引起了前缀::ffff:
。
Dotted-quad notation
。
Answers:
::ffff:
是放置在IPv6(128位)空间内的IPv4(32位)地址的子网前缀。IPv6分为两部分,子网前缀和接口后缀。每个位长为64位,或者是4组的4个十六进制字符。
在IPv6中,允许您删除前导零,然后删除连续的零,即::ffff:
实际上转换为0000:0000:ffff:0000
,此地址已指定为IPv4到IPv6的子网前缀,因此任何IPv6处理器都可以理解它正在使用IPv4地址并进行处理。相应地。
在不久的将来,IP地址将全部为IPv6,这是因为我们在IPv4地址空间中几乎用完了数字(42亿,减去其他用途的空间)。
IPv6允许更大的空间。“ 340亿美元对任何人都应该足够”-比尔·盖茨在IPv6上发表讲话。
开始使用IPv6名称空间寻址IP地址并因此将其包含::ffff:
在代码中非常重要,因为将来在这些冒号之间会出现实际的十六进制数据。如果出于审美原因将其剥离,则当代码切换到IPv6网络或遇到IPv6地址时,代码将中断。
有些网络当前正在运行IPv6,很快您将面临IPv6 IP地址;这将给您带来麻烦。立即取得飞跃,否则将来就有可能破坏您的代码。
问题的TL; DR(简短)版本是:一切正常。请勿更改,它是IPv4地址的IPv6版本。
如果要使代码与IPv6兼容,只需检查::ffff:
前缀...是否存在,将其删除并将其余部分作为IPv4处理...如果::ffff:
不存在,则为IPv6地址,需要这样处理。您可以通过查看句点是否在字符串中来进行双重检查,如果是,则为IPv4。
请记住,除了需要对IP地址进行调整以外的所有内容,您只是在记录IP,对吗?这对于解析器和日志聚合::ffff:127.0.0.1
在将来的预期中非常重要。除非您需要更改IP,否则请保留其原样。
::ffff:
前缀听起来很危险。您知道,IPv6有许多符号。
如果仅需要IPv4,则可以强制节点服务器使用IPv4进行侦听。
对于快速应用程序编辑/bin/www
:
更改
server.listen(port);
至
server.listen(port, '0.0.0.0');
这至少对我有用。
https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback
尝试通过删除子网划分来获取确切的IP地址,
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
ip = ip.toString().replace('::ffff:', '');
您可以使用套接字单独获得IP地址或与指定的家庭获得IP地址
var app = require('express')();
app.get("/ip", (req, res) => {
console.log(req.ip)
let ip = req.ip.split(':');
let ip_details = req.socket.address();
console.log(ip_details);
// { address: '::ffff:127.0.0.1', family: 'IPv6', port: 3001
console.log(ip[3]);//127.0.0.1
res.json(ip[3]);
}
var ip = req.ip.split(':').pop();
req.ip
还是req.ips
?