我在弹性负载平衡器(elb)后面的实例存储器亚马逊机器上有一个节点应用程序。但是,远程IP地址似乎总是相同的。我使用此代码在节点中获取客户端的IP地址(通过connect / express):
req.socket.remoteAddress
我没有从节点文档中获得任何其他内容。任何提示?
答案 0 :(得分: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 );
答案 1 :(得分:7)
如果您使用快递,这是一个解决方案:
根据{{3}},您可以为您的快速实例启用trust proxy
,然后req.ip
将使用正确的IP地址填充。
通过app.enable('trust proxy')启用“信任代理”设置, 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();
});
答案 2 :(得分: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 );
}
);