2013-10-09 224 views
24

req.connection.remoteAddress,req.headers ['x-forwarded-for'],req.ip,req.ips,这是什么意思?Node.js:获取客户端IP

是否有简单的方法来获取客户端/用户代理的IP地址,向Node.js/Express发出请求到我的站点?我不理解所有代理的东西或者req对象的所有属性之间的所有差异。另外,我不明白什么'信任代理'选项是为Express。

有人能给我一个直截了当的解释,所有这些属性之间的区别是什么,并回答我如何才能简单地获得客户的IP?

+0

如何使用** [节点ipware(https://github.com/un33k/node-ipware)**按说明** [这里](http://stackoverflow.com/a/26310355/458879)**。 – un33k

回答

46

req.ip是以Express方式获取客户端IP地址的直接方式。您可以看到它使用的逻辑(其中涉及从代理地址req.ips的阵列中抓取第一项,其中该阵列由x-forwarded-for标题构建)here

+0

你能描述一下x-forwarded-for是什么吗? – Sam

+1

服务器前面的每个代理都会添加x-forwarded-for标头。这里有更多的信息:http://en.wikipedia.org/wiki/X-Forwarded-For – dankohn

16
// Get client IP address from request object ---------------------- 
getClientAddress = function (req) { 
     return (req.headers['x-forwarded-for'] || '').split(',')[0] 
     || req.connection.remoteAddress; 
}; 
+0

什么'req'对象拥有,我的意思是我们在那里提供什么? –

+2

请注意''req.headers ['x-forwarded-for']'很容易在PC上操作,除非您已将Node.JS服务器放置在可信和正确配置的代理服务器之后。在尊重'req.headers ['x-forwarded-for']'之前,您应该首先检查'req.connection.remoteAddress'对已知可信代理服务器的列表。 –

+0

欣赏OR和拆分补充。如果您的应用程序支持负载均衡器和/或缓存层,这很好。 – KLVTZ

-1

获取客户端的IP是非常简单的:

var ip = req.headers['x-forwarded-for'] || 
    req.connection.remoteAddress || 
    req.socket.remoteAddress || 
    req.connection.socket.remoteAddress; 
    console.log(ip); 
+1

请注意'req.headers ['x-forwarded-for']'很容易在PC上操作,除非您已将Node.JS服务器放置在可信和正确配置的代理服务器之后。在尊重'req.headers ['x-forwarded-for']'之前,您应该首先检查'req.connection.remoteAddress'对已知可信代理服务器的列表。如果涉及多个代理,则req.headers ['x-forwarded-for']'可能包含逗号分隔的列表。 –

1

很简单

function getClientIP(req){ 
    return req.headers['x-forwarded-for'] || req.connection.remoteAddress; 
} 
+1

嗨,我已经放置'app.enable('信任代理');'在我的server.ts文件中'我的下面的代码'从'./backend/api'导入{serverApi,createTodoApi}; app.get('/ data.json',serverApi); app.use('/ api',createTodoApi());'并在我的后端/ api.ts文件中访问变量'req.ip'。在返回':: ffff:127.0.0.1'的地方,它不是一个有效的IP地址来获取它的位置。等待你的答复。谢谢! –

0

至于其他的已经指出,由于使用了潜在代理的使用,你真的应该使用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 - 转发,对于头传递会存储在req.ip中,但只有它来自可信代理之一。

更多关于信任代理can be found here

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

要始终获得IPv4地址我:

getClientAddress = function (req) { 
     return req.ip.split(":").pop(); 
};