我不完全明白,我怎么应该得到一个远程用户的IP地址。
比方说,我有一个简单的请求途径,如:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
是上述方法正确才能获得真正用户的IP地址,或是否有更好的办法? 并且怎么样代理?
如果你喜欢背后nginx的或你有什么代理运行,只有这样,你应该检查“X-转发目标是为”:
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
如果代理不是“你”,我不会相信的“X-转发目标为”头,因为它可能会被欺骗。
虽然从@alessioalex作品的回答,有作为特快规定背后的代理部的另一方式快速-指导 。
- 加入
app.enable('trust proxy')
对您的明确初始化代码。 - 如果你想获得远程客户端的IP地址,使用
req.ip
或req.ips
以通常的方式(如如果没有一个反向代理)
对于“信任代理”有了更多的选择,如果你需要的东西比信任一切通过X转发换头中传递更加复杂,并且您的代理不会删除从不受信任来源已有的X-转发换头。 详情请参见链接的指南。
注: req.connection.remoteAddress
不会与我的解决办法工作。
在nginx.conf
文件:
proxy_set_header X-Real-IP $remote_addr;
在node.js
服务器文件:
var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
注意,快递小写头
特别是对于节点,该文档的HTTP服务器组件,在活动连接说:
[触发]建立一个新的TCP流时。 [本]插座型net.Socket的对象。 通常用户将要访问此事件。 具体地,插座将不会因为发射的协议解析器如何附接到插座可读事件。 插座也可以在访问request.connection
。
因此,这意味着request.connection
是一个插座,根据文档的确有socket.remoteAddress其中根据文档属性:
远程IP地址的字符串表示。 例如,'74 .125.127.100' 或 '2001:4860:A005 :: 68'。
在快递,请求目的是,节点HTTP请求对象的实例,所以这种方式应该仍然工作。
然而,Express.js下请求中已经有两个属性: req.ip和req.ips
req.ip
返回的远程地址,或当启用“信任代理” - 上游地址。
req.ips
当“信任代理”是true
,解析“X -转发,” IP地址列表,并返回一个数组,否则将返回一个空数组。 例如,如果值是“客户端,PROXY1,Proxy2发出”您将接收阵列[“客户端”,“PROXY1”,“Proxy2将”],其中“Proxy2发出”是最远的下游。
这可能是值得一提的是,根据我的理解,快递req.ip
比一个更好的方法req.connection.remoteAddress
,因为req.ip
包含实际的客户端IP(前提是信任代理快递启用),而其他可能包含代理的IP地址(如果有的话)。
这就是为什么目前接受的答案建议:
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
所述req.headers['x-forwarded-for']
将是明确的等效req.ip
。
据代理后面快速 , req.ip
已经考虑到反向代理服务器,如果你已经配置了trust proxy
正确。 因此它比更好req.connection.remoteAddress
其从网络层来获得并且不知道代理的。
这为我工作比其他人更好。 我的网站是背后的CloudFlare,它似乎需要cf-connecting-ip
。
req.headers['cf-connecting-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress
没有测试快递代理后面 ,因为它并没有说这事, cf-connecting-ip
报头。
标头对象有你需要的,只是这样做的一切:
var ip = req.headers['x-forwarded-for'].split(',')[0];
只要使用这个快递中间件https://www.npmjs.com/package/express-ip
您可以通过安装模块
npm i express-ip
用法
const express = require('express');
const app = express();
const expressip = require('express-ip');
app.use(expressip().getIpInfoMiddleware);
app.get('/', function (req, res) {
console.log(req.ipInfo);
});
VAR IP = req.connection.remoteAddress;
IP = ip.split( ':')[3];
我知道这个问题已经回答了,但在这里就是我得到了我的工作。
let ip = req.connection.remoteAddress.split(`:`).pop();