Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Amazon弹性负载平衡器未填充x-forwarded-proto头_Node.js_Amazon Web Services_Express_Amazon Ec2_Load Balancing - Fatal编程技术网

Node.js Amazon弹性负载平衡器未填充x-forwarded-proto头

Node.js Amazon弹性负载平衡器未填充x-forwarded-proto头,node.js,amazon-web-services,express,amazon-ec2,load-balancing,Node.js,Amazon Web Services,Express,Amazon Ec2,Load Balancing,我试图将所有http请求强制转换为https请求,但由于弹性负载平衡器没有在请求中填充x-forwarded-proto头,所以我面临这个问题 这就是我正在使用的代码,它导致了重定向循环。我如何解决这个问题 app.use (function (req, res, next) { console.log('Request headers = ' + JSON.stringify(req.headers)); console.log('Request protocol = ' +

我试图将所有http请求强制转换为https请求,但由于弹性负载平衡器没有在请求中填充x-forwarded-proto头,所以我面临这个问题

这就是我正在使用的代码,它导致了重定向循环。我如何解决这个问题

app.use (function (req, res, next) {
    console.log('Request headers = ' + JSON.stringify(req.headers));
    console.log('Request protocol = ' + JSON.stringify(req.protocol));
    var schema = (req.headers['x-forwarded-proto'] || '').toLowerCase();
    if (schema === 'https') {
       next();
    } else {
       res.redirect('https://' + req.headers.host + req.url);
    }
});

将http和https请求发送到两个不同的端口。如果请求通过http端口发送,您可以安全地重定向它。

听起来您的ELB侦听器可能配置为TCP而不是http。配置为TCP时,它不会添加X-Forwarded-Proto或X-Forwarded-for。

您是说在
app.js
中有两个端口和两个http服务器?实际上,这都是由EBS和负载平衡器自动配置的。这就是问题所在。你说的自动配置是什么意思?你用的是弹性豆茎吗?如果您已经创建了负载平衡器,您可以按照任何方式配置侦听器。好的,我已经在不同的端口上配置了侦听器。80上的http和443上的https。如何在我的
app.js
中使用此信息。我的意思是,在配置了这些侦听器之后,其他一切都由EBS和负载平衡器自动完成。问题是https和http都作为http请求到达app.js。https请求由负载平衡器进行插入和解密,之后都是http。解决方案需要在ELB和web服务器中实现。在web服务器上,您可以定义两个虚拟主机,它们列在不同的端口上(例如80和81)。端口80上的虚拟主机将所有流量重定向到https,然后https将到达端口81上的正常站点。