我试图搜索很多,以找到一种方法来了解客户端和服务器的IP地址和端口号.到目前为止,我发现:
req.ip. req和res对象后,我发现有时res.connection._peername包含客户端IP地址和端口号.但这不是找到端口号的可靠方法,因为在某些请求中缺少此属性.那么,了解端口的正确方法是什么?listener.address().port [source]知道.但它可以从已知req或res对象?实际上我想知道我所拥有的中间件内的端口号req,res并且next只是(基本上app.use(function(req,res,next){...}))).jfr*_*d00 15
如果您与客户端有直接连接(在路上没有代理),您可以使用这些属性获取这四个值:
req.connection.remoteAddress
req.connection.remotePort
req.connection.localAddress
req.connection.localPort
Run Code Online (Sandbox Code Playgroud)
net.js中的相关node.js源代码指针:https://github.com/nodejs/node/blob/863952ebadd4909a66bb9da7868bf75bbbe1462d/lib/net.js#L608
注意:当您将这些作为属性值访问时,它们在技术上被实现为getter.您无法设置这些属性.
如果在实际服务器前面有服务器基础结构(如负载平衡器,代理等),则上述本地值可能会返回本地服务器,而不是客户端最初连接到的实际公共IP /端口.检索原始公共IP /端口的唯一方法是,如果您的基础架构将原始文件设置为HTTP标头(某些代理设置IP,不知道是否有任何代理设置端口),因为它们不存在于当前原始TCP中来自代理的连接.
对于涉及代理的情况,您可能还需要查看一些HTTP标头:
X-Forwarded-For - The IP address of the client before it went through the proxy
X-Forwarded-Port - The port of the client before it went through the proxy
Run Code Online (Sandbox Code Playgroud)
如果X-Forwarded标头已通过多个代理,则它们也可以是逗号分隔列表,例如:
X-Forwarded-For: OriginatingClientIPAddress, proxy1-IPAddress, proxy2-IPAddress
Run Code Online (Sandbox Code Playgroud)
RFC 7239 2014 还有一个标准标题:
Forwarded: for=192.0.2.60; proto=http; by=203.0.113.43
Run Code Online (Sandbox Code Playgroud)