我正在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,但还没有找到解决方案。
1条答案
按热度按时间i2byvkas1#
刚刚解决了这个。
传递true而不是one起作用。
字符串
如果为true,则客户端的IP地址将被理解为
X-Forwarded-For
标头中最左边的条目。您可以从here阅读更多内容