34

req.connection.remoteAddress, req.headers['x-forwarded-for'], req.ip, req.ips,这都是什么意思?

有没有一种直接的方法可以简单地获取在 Node.js/Express 中向我的站点发出请求的客户端/用户代理的 IP 地址?我不了解所有代理内容或 req 对象的所有属性之间的所有差异。另外,我不明白 Express 的“信任代理”选项是什么。

有人可以直接解释所有这些属性之间的区别,并回答我如何才能简单地获取客户的 IP 吗?

4

5 回答 5

62

req.ip是在 Express 中获取客户端 IP 地址的直接方法。您可以在此处查看它使用的逻辑(涉及从代理地址数组中获取第一项,req.ips该数组是从x-forwarded-for标头构造的)。

于 2013-10-09T08:53:57.727 回答
21
// Get client IP address from request object ----------------------
getClientAddress = function (req) {
        return (req.headers['x-forwarded-for'] || '').split(',')[0] 
        || req.connection.remoteAddress;
};
于 2013-10-10T11:19:46.850 回答
4

正如其他人所指出的,由于使用代理的潜在用途,您确实应该使用req.ip而不是像许多人推荐的那样使用 X-Forwarded-For 标头。只要您正确地将代理配置为可信代理,req.ip就会始终返回最终用户的 IP 地址。

例如,如果你有一个从 8.8.8.8 连接的代理,你会这样做:

var express = require('express');
var app = express();
app.set('trust proxy', '8.8.8.8');

由于您信任代理,因此现在可以将在 X-Forwarded-For 标头中传递的内容存储在 中req.ip,但前提是它源自受信​​任的代理之一。

更多关于信任代理的信息可以在这里找到

现在,正如其他人在评论中指出的那样;特别是在本地开发时,您可能会得到ip“::ffff:127.0.0.1”的格式。

为了始终获得我拥有的 IPv4 地址:

getClientAddress = function (req) {
    return req.ip.split(":").pop();
};
于 2017-11-11T21:17:35.467 回答
3

很简单

function getClientIP(req){
    return req.headers['x-forwarded-for'] || req.connection.remoteAddress;
}
于 2017-01-24T13:05:17.820 回答
0

获取客户端 IP 非常简单:

 var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     req.connection.socket.remoteAddress;
     console.log(ip);
于 2015-06-08T18:55:47.697 回答