1、X-Real-IP
nodejs服务nginx做的反向代理,之前一直用从请求头里边字段X-Real-IP获取真实ip,nginx配置如下
location / {
proxy_set_header X-Real-IP $remote_addr;
}
X-Real-IP,没有相关标准,比如Nginx,一般会是与之直接连接的客户端IP,如果经过多级代理,最后拿到的真实ip是与之直接相连的上级代理的ip,而不是客户端得真实ip。
2、X-Forwarded-For
一般来说,X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中。
例如:来自4.4.4.4的一个请求,header包含这样一行:
X-Forwarded-For:1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理。
Nginx配置如下:
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
3、X-Forwarded-For和X-Real-IP的区别
1)X-Forwarded-For记录的是经过的所有代理ip,X-Real-IP记录上一级的ip
2)当只有一级代理的时候,两者的值是相等的
3)通常情况下使用X-Forwarded-For获取
node.js
1 获取客户端的真实IP
let getClientIp = function (req) {
return req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress || '';
};
console.log(getClientIp(req));
let ip = getClientIp(req).match(/\d+.\d+.\d+.\d+/);
console.log(ip);
ip = ip ? ip.join('.') : null;
console.log(ip);
2:获取客户端的域名
let domain = req.headers['referer'].match(/^(\w+:\/\/)?([^\/]+)/i);
domain = domain ? domain[2].split(':')[0].split('.').slice(-2).join('.') : null;
注意点:获取客户端的ip老版本有一个req.headers['X-Real-IP'] 方法,该方法有时候会获取不到或者不支持,建议不去添加到获取ip方法