如何从控制器中确定给定请求的 IP 地址?例如(快递):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
原文由 Shamoon 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何从控制器中确定给定请求的 IP 地址?例如(快递):
app.post('/get/ip/address', function (req, res) {
// need access to IP address here
})
原文由 Shamoon 发布,翻译遵循 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 地址。在此示例中,请求通过 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
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 许可协议
5 回答4.9k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
2 回答1.8k 阅读✓ 已解决
5 回答2k 阅读
3 回答2k 阅读
1 回答3.3k 阅读
1 回答2.7k 阅读
在您的
request
对象中有一个名为socket
的属性,它是一个net.Socket
对象。net.Socket
对象具有属性remoteAddress
,因此您应该能够通过以下调用获取 IP:(如果您的节点版本低于 13,请使用现已弃用的
request.connection.remoteAddress
)编辑
正如@juand 在评论中指出的那样,如果服务器位于代理后面,则获取远程 IP 的正确方法是
request.headers['x-forwarded-for']
编辑 2
将
express
与 Node.js 一起使用时:如果您设置
app.set('trust proxy', true)
,req.ip
将返回真实的 IP 地址,即使在代理之后。 查看文档以获取更多信息