返回站点访问者的IP地址,而不是Heroku服务器

83qze16e  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(173)

因此,我尝试获取Heroku上我的应用程序的访问者的IP地址,我为此使用了API,该API在本地运行良好,但当我在Heroku上部署应用程序时,我获取了Heroku服务器的IP,它是一个express.js应用程序,并使用此设置

app.set('trust proxy', true);

我见过很多解决这个问题的方法,但没有一个对我有效。
当我使用

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

我得到这个结果

clientIp: '::1',
slwdgvem

slwdgvem1#

首先,您必须安装此模块npm i ipware

var get_ip = require('ipware')().get_ip;

app.use(function(req, res, next) {
    var ip_info = get_ip(req);
    console.log(ip_info);
    // { clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

请注意,结果是以对象形式出现的,获取ipaddress应该很简单,就像

ip_info.clientIp

所以我想这应该会有帮助。

vpfxa7rd

vpfxa7rd2#

var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     (req.connection.socket ? req.connection.socket.remoteAddress : null);

但有时您可以通过此**req.headers ['x-forwarded-for']**获得多个IP地址

var ipAddr = req.headers["x-forwarded-for"];
      if (ipAddr){
        var list = ipAddr.split(",");
        ipAddr = list[list.length-1];
      } else {
        ipAddr = req.connection.remoteAddress;
      }

你用基本的if else控制。
或者,您可以使用这个方法,并在答案的顶部替换为req.headers ['x-forwarded-for']

let ip = request.headers['x-forwarded-for'].split(',')[0]
vxf3dgd4

vxf3dgd43#

我将假设操作员正在使用此API -http://geo.ipify.org/api/v2/country
API实际上在本地和生产(Heroku上)中都运行良好。真实的的问题或为什么显示Heroku服务器的IP地址而不是访问者的IP地址的原因是,正如@SuperStormer所提到的,您现在是从Heroku服务器调用API。
正如Op所指出的,在express.js中有不同的方法来获得用户的IP地址。
我查了本地和Heroku上这三个人的使用情况

  • req.ip
  • 请求标头[“x-转发-for”]
  • req.connection.remoteAddress

这是Heroku日志x1c 0d1x上的内容

**PS:**信任代理已设置为true,这就是req.ipreq.headers.["x-forwarded-for"]具有相同值的原因。

req.connection.remoteAddress返回的IP地址是以IPv6表示法表示的IPv4地址,并且由于它不符合先前的值,因此它证明了在客户端和服务器之间存在代理的事实。
当您在本地主机上时:访问req对象返回的IP地址通常为::1
::1实际上是IP地址,是本地主机的IPV6表示法。IPv4中的环回地址为127.0.01。在IPv6中,环回地址为0:0:0:0:0:0:0:1或::1。
您可以阅读此how-to-guide以了解有关获取IP地址的不同方法的更多信息。

相关问题