req.connection.remoteAddress,req.headers['x-forwarded-for'],req.ip,req.ips,这些都是什么意思?
在Node.js/Express中,有没有一种简单直接的方法来获取向我的站点发出请求的客户端/用户代理的IP地址?我不理解所有代理的内容或req对象的所有属性之间的区别。此外,我不了解Express中'trust proxy'选项的含义。
有人能够简单明了地解释这些属性之间的区别,并回答如何简单获取客户端的IP地址吗?
req.connection.remoteAddress,req.headers['x-forwarded-for'],req.ip,req.ips,这些都是什么意思?
在Node.js/Express中,有没有一种简单直接的方法来获取向我的站点发出请求的客户端/用户代理的IP地址?我不理解所有代理的内容或req对象的所有属性之间的区别。此外,我不了解Express中'trust proxy'选项的含义。
有人能够简单明了地解释这些属性之间的区别,并回答如何简单获取客户端的IP地址吗?
req.ip
是在 Express 中获取客户端 IP 地址的简单方法。您可以查看它使用的逻辑(其中涉及从代理地址数组 req.ips
中获取第一个项目,该数组是从 x-forwarded-for
头部构建的)这里。
// Get client IP address from request object ----------------------
getClientAddress = function (req) {
return (req.headers['x-forwarded-for'] || '').split(',')[0]
|| req.connection.remoteAddress;
};
req
对象保存了什么内容,我的意思是我们应该在那里提供什么? - Sanjayreq.headers['x-forwarded-for']
很容易被篡改。在尊重req.headers['x-forwarded-for']
之前,您应该首先将req.connection.remoteAddress
与已知的可信代理服务器列表进行比较。 - 700 Software::ffff:127.0.0.1
,后续每次访问都返回 ::1
。这两个地址均不是公共 IP 地址,无法获取其位置信息。请帮我解决此问题。谢谢! - Dynamic Remo正如其他人所指出的,由于可能使用代理的原因,您真的应该使用req.ip
而不是像许多人推荐的那样使用X-Forwarded-For头。只要正确配置代理作为可信代理,req.ip
将始终返回最终用户的IP地址。
例如,如果您有一个代理连接自8.8.8.8,则可以执行以下操作:
var express = require('express');
var app = express();
app.set('trust proxy', '8.8.8.8');
如果你信任代理,那么 X-Forwarded-For 标头中传递的内容将存储在 req.ip
中,但仅当它来自受信任的代理之一时才会存储。
有关信任代理的更多信息请点击此处。
现在,正如其他人在评论中指出的那样,特别是在本地开发时,你可能会得到格式为“::ffff:127.0.0.1”的 ip
。
为了始终获取 IPv4 地址,我已经采取了以下措施:
getClientAddress = function (req) {
return req.ip.split(":").pop();
};
function getClientIP(req){
return req.headers['x-forwarded-for'] || req.connection.remoteAddress;
}
import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi());
后放置了app.enable('trust proxy');
,并在我的backend/api.ts文件中访问变量req.ip
。它返回的是::ffff:127.0.0.1
,这不是一个有效的IP地址,无法从中获取位置信息。等待您的回复。谢谢! - Dynamic Remoffff
。虽然它很容易解析,但我选择根据 这个答案 将服务器设置为仅监听 IPv4(反正我有代理),这样就可以在 remoteAddress
上得到一个干净的 IPv4。 - Nagev获取客户端IP非常简单:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
console.log(ip);
req.headers['x-forwarded-for']
很容易被 PC 操纵。在接受 req.headers['x-forwarded-for']
之前,你应首先将 req.connection.remoteAddress
与已知的可信代理服务器列表进行比对。如果有多个代理涉及,则 req.headers['x-forwarded-for']
可能包含一个逗号分隔的列表。 - 700 Software