首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Express.js req.ip返回::ffff:127.0.0.1

Express.js req.ip返回::ffff:127.0.0.1
EN

Stack Overflow用户
提问于 2015-04-02 11:14:46
回答 8查看 93.1K关注 0票数 137

我目前正在尝试获取所请求用户的IP。问题是IP返回的是::ffff:127.0.0.1而不是127.0.0.1。我尝试使用trusted proxy选项(尽管不使用代理),req.ips是空的。使用4.x Express.js。

代码语言:javascript
复制
router.get('/', function(req, res, next) {
    console.log('ip', req.ip)
    res.send({})
});
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 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,就把它当作你收到的东西吧。

票数 218
EN

Stack Overflow用户

发布于 2016-09-13 14:54:56

这似乎是ipv6的一个怪癖:对于ipv4地址,ipv6似乎将ipv6符号与ipv4符号混合在一起。

为了以简单、不混合的方式获取ipv4和ipv6地址,我使用:

代码语言:javascript
复制
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
if (ip.substr(0, 7) == "::ffff:") {
  ip = ip.substr(7)
}
票数 38
EN

Stack Overflow用户

发布于 2018-10-09 15:04:27

如果您只需要IPv4,可以强制节点服务器使用IPv4侦听。

用于快速应用程序编辑/bin/www

变化

代码语言:javascript
复制
server.listen(port);

代码语言:javascript
复制
server.listen(port, '0.0.0.0');

至少对我有用。

回调

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29411551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档