我目前正在尝试获取所请求用户的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({})
});
::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,否则只需将其保留为您收到的 IP 即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)