【发布时间】:2021-08-19 01:17:45
【问题描述】:
我正在使用这段代码来获取 Node.js 中的 ip 地址:
const ip = await (req.headers['x-forwarded-for'] || '').split(',').pop().trim() || req.socket.remoteAddress;
对于我家庭 wifi 网络上的所有设备,当我使用手机上的数据访问我的网站时,我会得到这个 IP 地址:::ffff:127.0.0.1
我正在尝试获取访问我网站的每台设备(手机、笔记本电脑)的 IP 地址。但是所有设备都显示相同的 IP 地址。
如何在 Node.js 中获取每个设备的单独设备 ip 地址?
编辑:
我进行了一些更新,但不再获得 ::ffff:127.0.0.1。我现在得到了互联网连接的 IP 地址。所以如果我连接到 wifi,我会得到 wifi 调制解调器的 IP 地址。如果我在使用数据,我会得到数据连接 ip 地址。
但我需要获取设备 IP 地址。我不想要连接 IP 地址。我想要设备的 IP 地址。
以下是我所做的更改:
我将“信任代理”设置为 true:
app.set('trust proxy', true);
我将 etc/nginx/sites-available/mysite 文件更新为如下所示:
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:5050;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
我将 etc/nginx/proxy_params 文件更新为如下所示:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
我做错了什么?我该如何解决?从我正在阅读的内容来看,听起来我应该能够使用 req.headers['x-forwarded-for'] 来获取正确的 IP 地址,但是 req.headers['x-forwarded-for'] 返回与 req.headers['x-real-ip'] 相同,只是它在数组中。
【问题讨论】:
-
在路由的情况下,如果网络被引导通过一个而不是设备,则 IP 地址是路由器的 IP 地址。因此,您为所有设备获得相同的 IP 地址,即路由器本身的 IP 地址。我不确定,但我相信这就是您获得相同地址的原因。
-
一开始我也是这么想的。但是当我使用手机数据时显示相同的 IP 地址,而不是我的路由器/wifi 互联网。我也刚刚问了一个人,发现它显示了一个不在我的 wifi 上的手机的相同 IP 地址。
-
你试过
req.connection.remoteAddress吗? -
看看这是否有帮助:- stackoverflow.com/questions/10849687/…
-
如果您举例说明您希望获得的 IP 地址 - 或者至少是什么类型或范围,可能会有所帮助。如果您尝试获取一个通过 NAT 的地址(例如,我的机器的地址为 192.168.0.101)并且您希望从公共托管网站的 XFF 标头返回 that互联网,那么你要求的是不可能的。这同样适用于私有范围内的任何内容。见en.wikipedia.org/wiki/Private_network
标签: javascript node.js express nginx