如何在 Heroku 上使用 Express.js 获取实际客户端 IP 地址

问题描述 投票:0回答:1

我正在 Heroku 上使用 Express.js 运行 Node.js 服务器,并且我试图获取向我的服务器发出请求的客户端的实际 IP 地址。但是,由于 Heroku 网络的配置,我获取的是 Heroku 反向代理的 IP 地址,而不是客户端 IP。

我需要客户端 IP 地址的主要原因是因为我使用 express-rate-limit 软件包来降低 DDOS 攻击的风险。这是我的速率限制器的配置:

const app = express();
const http = require("http");
const server = http.createServer(app);

app.use(
  cors({
    origin: true,
  })
);

app.use(
  bodyParser.urlencoded({
    extended: true,
  })
); 

const rateLimit = require('express-rate-limit')

const limiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 15, // limit each IP to 15 requests per windowMs
  message: "Woah! Slow down there cowboy. You can try again in 2 minutes.",
  onLimitReached: async function(req, res, options) {
    try{
      console.log(`Rate limit exceeded for IP: ${req.ip}`);

      if(req.ip){
        const geoInfo = await getGeoInfo(req.ip); // function to get geolocation info
        //sending slack hook containing ip
      }else{
        //sending slack hook without ip
      }
    }catch(err){
      console.error('[E353]',err);
    }
  }
});

app.use(limiter);

我已经尝试在 Express.js 配置中将“信任代理”设置为 1(如 此 StackOverflow 答案中所建议)

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

我一直在阅读 Express.js 代理背后工作指南,但尚未找到解决方案。

node.js heroku ip
1个回答
1
投票

刚刚解决了这个问题。

传递 true 而不是有效。

app.set('trust proxy', true) 

如果为 true,客户端的 IP 地址将被理解为

X-Forwarded-For
标头中最左侧的条目。

您可以从这里

阅读更多内容
© www.soinside.com 2019 - 2024. All rights reserved.