Express.js:如何让远程客户端地址Express.js:如何让远程客户端地址(Express

2019-05-16 21:06发布

我不完全明白,我怎么应该得到一个远程用户的IP地址。

比方说,我有一个简单的请求途径,如:

app.get(/, function (req, res){
   var forwardedIpsStr = req.header('x-forwarded-for');
   var IP = '';

   if (forwardedIpsStr) {
      IP = forwardedIps = forwardedIpsStr.split(',')[0];  
   }
});

是上述方法正确才能获得真正用户的IP地址,或是否有更好的办法? 并且怎么样代理?

Answer 1:

如果你喜欢背后nginx的或你有什么代理运行,只有这样,你应该检查“X-转发目标是为”:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

如果代理不是“你”,我不会相信的“X-转发目标为”头,因为它可能会被欺骗。



Answer 2:

虽然从@alessioalex作品的回答,有作为特快规定背后代理部的另一方式快速-指导 。

  1. 加入app.enable('trust proxy')对您的明确初始化代码。
  2. 如果你想获得远程客户端的IP地址,使用req.ipreq.ips以通常的方式(如如果没有一个反向代理)

对于“信任代理”有了更多的选择,如果你需要的东西比信任一切通过X转发换头中传递更加复杂,并且您的代理不会删除从不受信任来源已有的X-转发换头。 详情请参见链接的指南。

注: req.connection.remoteAddress不会与我的解决办法工作。



Answer 3:

nginx.conf文件:
proxy_set_header X-Real-IP $remote_addr;

node.js服务器文件:
var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;

注意,快递小写头



Answer 4:

特别是对于节点,该文档的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



Answer 5:

  1. 加入app.set('trust proxy', true)
  2. 使用req.ipreq.ips以通常的方式


Answer 6:

据代理后面快速 , req.ip已经考虑到反向代理服务器,如果你已经配置了trust proxy正确。 因此它比更好req.connection.remoteAddress其从网络层来获得并且不知道代理的。



Answer 7:

这为我工作比其他人更好。 我的网站是背后的CloudFlare,它似乎需要cf-connecting-ip

req.headers['cf-connecting-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress

没有测试快递代理后面 ,因为它并没有说这事, cf-connecting-ip报头。



Answer 8:

标头对象有你需要的,只是这样做的一切:

var ip = req.headers['x-forwarded-for'].split(',')[0];


Answer 9:

只要使用这个快递中间件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);
});


Answer 10:

VAR IP = req.connection.remoteAddress;

IP = ip.split( ':')[3];



Answer 11:

我知道这个问题已经回答了,但在这里就是我得到了我的工作。

let ip = req.connection.remoteAddress.split(`:`).pop();


文章来源: Express.js: how to get remote client address