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

rseugnpd  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在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配置中将“trust proxy”设置为1(如this StackOverflow answer)中所建议的)。

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


我一直在阅读Express.js guide for working behind proxies,但还没有找到解决方案。

i2byvkas

i2byvkas1#

刚刚解决了这个。
传递true而不是one起作用。

app.set('trust proxy', true)

字符串
如果为true,则客户端的IP地址将被理解为X-Forwarded-For标头中最左边的条目。
您可以从here阅读更多内容

相关问题