问题描述
期望的行为
在启用了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
,并发现了这个问题:
似乎在传达我所看到的是IPv6地址。
问题
为什么同一用户从ipinfo.io
(浏览器)和req.ip
(服务器)返回的值不同?
为什么req.ip
为某些用户返回一个IPv4
地址,而为其他用户返回一个IPv6
地址?
我还是应该让req.ip
返回一致的格式值,最好是IPv4格式,因为它更易于阅读,然后我的速率限制器mongodb条目看起来会一致?
解决方法
ipv4和ipv6都是“正确”的IP地址。只是不同的人以不同的协议连接到您的服务。您可以选择仅支持其中之一,但是最好同时支持两者。
如果您的应用程序同时支持两种格式,那么它们将更易于携带和使用。