特别是对于节点,事件连接下的http服务器组件的文档说:
[触发]当建立新的TCP流时。[the]套接字是net.Socket类型的对象。通常,用户将不希望访问此事件。特别是,由于协议解析器如何附加到套接字,套接字将不会发出可读事件。也可以通过访问套接字request.connection
。
因此,这意味着request.connection
是一个套接字,根据文档,确实存在一个socket.remoteAddress属性,根据该文档,它是:
远程IP地址的字符串表示形式。例如,“ 74.125.127.100”或“ 2001:4860:a005 :: 68”。
在express下,请求对象也是Node http请求对象的实例,因此此方法仍然可以使用。
但是,在Express.js下,请求已具有两个属性:req.ip和req.ips
要求
返回远程地址,或启用“信任代理”时-上游地址。
要求
当“信任代理”是true
,解析“X -转发,” IP地址列表,并返回一个数组,否则将返回一个空数组。例如,如果值是“ client,proxy1,proxy2”,您将收到数组[“ client”,“ proxy1”,“ proxy2”],其中“ proxy2”是最下游的。
值得一提的是,根据我的理解,Express req.ip
是比更好的方法req.connection.remoteAddress
,因为它req.ip
包含实际的客户端ip(前提是在express中启用了受信任的代理),而另一个可能包含代理的IP地址(如果有)之一)。
这就是为什么当前接受的答案建议的原因:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
该req.headers['x-forwarded-for']
会是相当的快递req.ip
。