微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

req.ip返回冒号分隔的值

如何解决req.ip返回冒号分隔的值

期望的行为

在启用了Cloudflare并设置了req.ip的Node / MongoDB / Azure环境中,通过app.set('trust proxy',true)获取用户的IP地址。您可以看到the node docs on this setting here

实际行为

行为不一致,有时req.ip将返回所需的值,例如4个用点分隔的值:

123.456.789.10

有时它返回这样的值,例如8个用冒号分隔的值:

2001:5005:1802:3500:18d2:k446:123b:g5h4
上面的

值仅是说明性的

此外,我从两个位置捕获IP,首先是从req.ip服务器端捕获,然后是从向ipinfo.io客户端的ajax请求捕获IP。如果req.ip查找失败,我将使用ipinfo.io

因此,在某些情况下,ipinfo.io将以期望的格式返回一个值,而req.ip将以意外的格式返回一个不同的值。我希望这些值保持一致/相同。

我尝试过的内容/上下文

我在node.js服务器文件中使用app.set('trust proxy',true)的原因是因为该站点已启用Cloudflare,并且我需要获取用户的实际IP地址。我正在使用两个基于IP地址和时间施加限制的速率限制程序包-例如,user1每5分钟可以提交3个请求。因此,该IP地址必须是实际的请求者,而不是cloudflare代理。

使用的软件包为:

Express Rate Limit-速率限制器逻辑
Rate Limit Mongo-一个支持包,用于跟踪来自MongoDB中IP地址的请求

我已经在Google上搜索req.ip returning string with colons node.js之类的内容,但搜索结果似乎与double colons有关,而不与single colons有关,例如:

Why is req.ip in node/Express returning colon separated IP addresses?

因此它们与似乎没有关系。

我还搜索ip address formats,并发现了这个问题:

IPv4 and IPv6 address formats

似乎在传达我所看到的是IPv6地址。

问题

为什么同一用户ipinfo.io(浏览器)和req.ip(服务器)返回的值不同?

为什么req.ip为某些用户返回一个IPv4地址,而为其他用户返回一个IPv6地址?

我还是应该让req.ip返回一致的格式值,最好是IPv4格式,因为它更易于阅读,然后我的速率限制器mongodb条目看起来会一致?

解决方法

ipv4和ipv6都是“正确”的IP地址。只是不同的人以不同的协议连接到您的服务。您可以选择仅支持其中之一,但是最好同时支持两者。

如果您的应用程序同时支持两种格式,那么它们将更易于携带和使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。