node.js express+;aws elb-从http重定向到https不工作

node.js express+;aws elb-从http重定向到https不工作,node.js,express,amazon-elb,Node.js,Express,Amazon Elb,我知道这已经在这里被问到和回答了,但仍然没有解决方案对我有效。以下是app.js: var express = require('express'); var app = express(); app.all(function(req, res, next){ if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) {

我知道这已经在这里被问到和回答了,但仍然没有解决方案对我有效。以下是app.js:

   var express  = require('express');
   var app      = express();

   app.all(function(req, res, next){
           if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https'))
           {
                console.log (req.get('Host'));
                console.log("not secure");
                res.redirect('https://' + req.get('Host') + req.url);
           }
           else{
           console.log("secure");
           next();
          }
      }
   );

   app.use(express.static('./server/static/'));
   app.listen(8080);
我也尝试过使用app.use,但仍然不起作用。 我们正在使用AWS ELB,以下是侦听器:

LB协议| LB端口|实例协议|实例端口

HTTPS | 443 | HTTP | 8080
HTTP | 80 | HTTP | 8080

正如在其他帖子中提到的,我在我的请求头中没有看到“x-forwarded-proto”。我相信监听器的配置是正确的,因此它们应该包含“x-forwarded”头,但事实并非如此

当我尝试在没有https的情况下点击dns时,它不会被重定向到https。 但是,http和https URL各自都可以正常工作


请帮我找出我遗漏了什么,或者是否需要提供更多信息。

您可能需要同时检查“X-Forwarded-Proto”和“X-Forwarded-Proto”(小写)。此外,请求在应用程序中永远不会安全,因此您还应该删除req.secure检查。最终的代码应该如下所示:

function forceHttps(req, res, next) {
    const xfp =
    req.headers["X-Forwarded-Proto"] || req.headers["x-forwarded-proto"];
    if (xfp === "http") {
        const secureUrl = `https://${req.headers.hostname}${req.url}`;
        res.redirect(301, secureUrl);
    } else {
        next();
    }
}
我们将此代码用于弹性负载平衡器后面的Express应用程序,它运行良好。如果您不想自己编写中间件,我们甚至创建了一个小的NPM包来处理这个问题:

安装

npm i --save @crystallize/elasticloadbalancer-express-force-https
用法

更多信息请参见我们的博文:

您可能需要同时检查“X-Forwarded-Proto”和“X-Forwarded-Proto”(小写)。此外,请求在应用程序中永远不会安全,因此您还应该删除req.secure检查。最终的代码应该如下所示:

function forceHttps(req, res, next) {
    const xfp =
    req.headers["X-Forwarded-Proto"] || req.headers["x-forwarded-proto"];
    if (xfp === "http") {
        const secureUrl = `https://${req.headers.hostname}${req.url}`;
        res.redirect(301, secureUrl);
    } else {
        next();
    }
}
我们将此代码用于弹性负载平衡器后面的Express应用程序,它运行良好。如果您不想自己编写中间件,我们甚至创建了一个小的NPM包来处理这个问题:

安装

npm i --save @crystallize/elasticloadbalancer-express-force-https
用法

更多信息请参见我们的博文:

@robertklep我能请你看看这个吗?很抱歉,我在这些帖子上看到了你的答案和评论。@robertklep我能请你看看这个吗?很抱歉这个绝望的求助电话,但我已经在这些帖子上看到了你的答案和评论。