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