一、问题描述
在做登录日志的时候想要获取客户端的ip, 网上查了一下 通过 req.headers['x-forwarded-for'] || req.connection.remoteAddress; 获取, 结果获取了之后不管是开发环境,还是生产环境获取到的一直都是 127.0.0.1,这是因为在配置Nginx的时候配置了如下框传来的内容, 这样Nginx默认将自己的地址设置为客户端的地址。
二、解决办法
给Nginx配置加上 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这样才能用 req.headers['x-forwarded-for'] || req.connection.remoteAddress; 获取到真实 ip 如下图
三、附上我的获取的代码
关键如下:
try {
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || 'Unknown';
if (ip.includes(':')) {
ip = ip.includes(':') ? ip.split(':').slice(-1)[0] : ip;
}
const city = new IP2Region().search(ip) ? new IP2Region().search(ip).city + new IP2Region().search(ip).isp : '';
const os = getOS(req.headers['user-agent']);
const browser = req.headers['user-agent'].split(' ')[0];
const sql = `INSERT INTO logs (username, ip, city, browser, os, create_time) VALUES (?,?,?,?,?,?)`;
const params = [user.username, ip, city, browser, os, moment().format('YYYY-MM-DD HH:mm:ss')];
db.queryAsync(sql, params).then(_ => {
res.send({
code: 200,
msg: '登录成功',
token
});
});
} catch (error) {
console.log('-------- logs error --------', error);
res.send({
code: 200,
msg: error,
token
});