2011-08-21 64 views
10

我有一个节点应用程序在一个实例存储亚马逊机器后面的弹性负载平衡器(ELB)。但是,远程IP地址似乎总是相同的。我用这个代码来获得在节点中的客户端的IP地址(通过连接/快递):远程IP地址与节点-js背后亚马逊ELB

req.socket.remoteAddress 

我没有得到任何东西从节点文档。任何提示?

+0

如果您是在TCP模式下使用ELB,看到http://stackoverflow.com/q/17981943/201952 – josh3736

回答

6

这里有一个解决方案如果你正在使用快递
按照documentation,您可以启用trust proxy为您的Express实例,然后req.ip将与正确的IP来填充地址。

通过启用“信任代理”通过app.enable(“信任代理”)的设置, Express将有知识,它的坐在后面的代理和 的X Forwarded- *头字段可以被信任,否则可能是 容易被欺骗。

启用此设置有几个微妙的影响。其中第一个 是由反向代理设置X-Forwarded-Proto,以告知 应用程序它是https还是简单的http。该值由 req.protocol反映。

第二个变化是req.ip和req.ips值将是 填充X-Forwarded-For的地址列表。

下面是一个例子:

var app = express(); 
app.enable('trust proxy'); 
// ... 

app.use(function(req, res, next) { 
    console.log('client ip address:', req.ip); 
    return next(); 
}); 
+0

我在过去的几年里实际上使用了这个,但忘记了这个问题:)再次感谢它! –

+2

express 4已经改变了['trust proxy'](http://expressjs.com/api.html#trust.proxy.options.table)选项的处理方式,所以你可以使用'app.set( '信任代理',1)'只信任你的负载平衡器 –

+0

顺便说一句,在亚马逊的情况下,我认为这个值必须是'2',一个用于实际机器上的nginx,另一个是实际负载平衡器。 –

6

您收到ELB实例的IP,您需要从头文件获取x-forwarded-for的值。因为我不是一个node.js的大师,我发现这个代码在http://forum.webfaction.com/viewtopic.php?id=4500

例子:

var http = require('http'), 
sys = require('sys'); 

http.createServer(
     function(req, res) { 
         var ip_address = null; 
         try { 
           ip_address = req.headers['x-forwarded-for']; 
         } 
         catch (error) { 
           ip_address = req.connection.remoteAddress; 
         } 
         sys.puts(ip_address); 
     } 
); 
+0

酷感谢,只是尝试它和它的作品。我不知道那个标题。 –

+6

如果'req.headers ['x-forwarded-for']'不存在,是不是错误。 'ip_address'将会是'undefined'。 'ip_address = req.headers ['x-forwarded-for'] || req.connection.remoteAddress';'将完成这项工作 –

7

答案为我工作,谢谢。但是你可能只是尝试:

var ip_address = null; 
if(req.headers['x-forwarded-for']){ 
    ip_address = req.headers['x-forwarded-for']; 
} 
else { 
    ip_address = req.connection.remoteAddress; 
} 
sys.puts(ip_address); 
+2

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

+0

没有'req.connection.remoteAddress' - 是否在NodeJS中被删除? – Redsandro