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

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

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

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

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

request.socket.remoteAddress

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

EDIT

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

EDIT2

express与 Node.js 一起使用时:

如果设置app.set('trust proxy', true),则req.ip将返回真实 IP 地址,即使在代理后面。Check the documentation for further information

515
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 地址。在此示例中,请求通过proxy1proxy2,然后通过proxy3proxy3显示为请求的远程地址。

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

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

使用现代 JS 的建议:

处理x-forwarded-for只有当设置,如果是这样,采取的第一个地址

其他参数使用optional chaining (?.)

const pIp = (req) =>
    req.headers['x-forwarded-for']?.split(',').shift()
    || req.socket?.remoteAddress
console.log(pIp(req))
// => 127.0.0.1
137

如果使用 express...

req.ip

我在查这个,然后我想等等,我在用快递。废话。

35

您可以保留DRY,只使用node-ipware,它同时支持IPv4IPv6

Install:
npm install ipware

在您的 app.js 或中间件中:

var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
    var ipInfo = getIP(req);
    console.log(ipInfo);
    // { clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

它将尽最大努力获取用户的 IP 地址,或返回127.0.0.1表示无法确定用户的 IP 地址。请查看README文件中的高级选项。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(174)
如何从谷歌静态地图Api卫星图像获取日期信息
上一篇
Android Studio媒体播放器如何淡入和淡出
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(68条)