如何从控制器中确定给定请求的 IP地址?例如(在 express 中):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
在您的request
对象中有一个名为socket
的属性,它是一个net.Socket
对象。net.Socket
对象有一个属性remoteAddress
,因此您应该能够通过此调用获得 IP:
request.socket.remoteAddress
(如果您的节点版本低于 13,请立即使用已弃用的request.connection.remoteAddress
)
正如 @ juand 在评论中指出的那样,如果服务器位于代理后面,则获取远程 IP 的正确方法是request.headers['x-forwarded-for']
将express
与 Node.js 一起使用时:
如果设置app.set('trust proxy', true)
,则req.ip
将返回真实 IP 地址,即使在代理后面。Check the documentation for further information
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 地址。在此示例中,请求通过proxy1
、proxy2
,然后通过proxy3
。proxy3
显示为请求的远程地址。
这是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
您可以保留DRY,只使用node-ipware,它同时支持IPv4和IPv6。
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文件中的高级选项。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(68条)