我正在 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 代理背后工作指南,但尚未找到解决方案。
刚刚解决了这个问题。
传递 true 而不是有效。
app.set('trust proxy', true)
如果为 true,客户端的 IP 地址将被理解为
标头中最左侧的条目。X-Forwarded-For
您可以从这里
阅读更多内容