如何在节点中确定用户的IP地址

新手上路,请多包涵

如何从控制器中确定给定请求的 IP 地址?例如(快递):

 app.post('/get/ip/address', function (req, res) {
    // need access to IP address here
})

原文由 Shamoon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 532
2 个回答

在您的 request 对象中有一个名为 socket 的属性,它是一个 net.Socket 对象。 net.Socket 对象具有属性 remoteAddress ,因此您应该能够通过以下调用获取 IP:

 request.socket.remoteAddress

(如果您的节点版本低于 13,请使用现已弃用的 request.connection.remoteAddress

编辑

正如@juand 在评论中指出的那样,如果服务器位于代理后面,则获取远程 IP 的正确方法是 request.headers['x-forwarded-for']

编辑 2

express 与 Node.js 一起使用时:

如果您设置 app.set('trust proxy', true)req.ip 将返回真实的 IP 地址,即使在代理之后。 查看文档以获取更多信息

原文由 topek 发布,翻译遵循 CC BY-SA 4.0 许可协议

var ip = req.headers['x-forwarded-for'] ||
     req.socket.remoteAddress ||
     null;

请注意,有时您可以在 req.headers['x-forwarded-for'] 中获得多个 IP 地址。此外,不会始终设置 x-forwarded-for 标头,这可能会引发错误。

该字段的一般格式为:

x-forwarded-for: client, proxy1, proxy2, proxy3

其中值是逗号+空格分隔的 IP 地址列表,最左边的是原始客户端,每个传递请求的后续代理添加它从中接收请求的 IP 地址。在此示例中,请求通过 proxy1proxy2proxy3proxy3 显示为请求的远程地址。

这是 Arnav Gupta 建议的解决方案, Martin 在下面的评论中针对未设置 x-forwarded-for 的情况提出了修复建议:

 var ip = (req.headers['x-forwarded-for'] || '').split(',').pop().trim() ||
         req.socket.remoteAddress

使用现代 JS 的建议:

  • processing x-forwarded-for only if set,如果是,取首地址
  • 其他参数使用 可选链接 (?.)
 const parseIp = (req) =>
    req.headers['x-forwarded-for']?.split(',').shift()
    || req.socket?.remoteAddress

console.log(parseIp(req))
// => 127.0.0.1

原文由 Edmar Miyake 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏