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

标签 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'))
           {
                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协议(protocol)| LB 港口 |实例协议(protocol)|实例端口

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

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

当我尝试访问不带 https 的 dns 时,它不会重定向到 https。 但是,http 和 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();
    }
}

我们将此代码用于 Elastic Load Balancer 后面的 Express 应用程序,并且运行良好。如果您不想自己编写中间件,我们甚至创建了一个小型 NPM 包来处理此问题:

https://www.npmjs.com/package/@crystallize/elasticloadbalancer-express-force-https

安装

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

使用

const express = require('express');
const forceHttps = require('@crystallize/elasticloadbalancer-express-force-https');
const server = express();
server.use(forceHttps());

我们的博客文章中提供了有关此内容的更多信息: https://snowball.digital/blog/force-https-behind-elastic-load-balancer-on-a-nodejs-application

关于node.js express + aws elb - 从 http 重定向到 https 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46351470/

相关文章:

amazon-web-services - 即使主机健康并且能够处理请求,ELB 也会返回 HTTP 504 错误

node.js - semantic-release 配置为仅从 master 发布

javascript - node.js "net"性能测试

javascript - Node + 蒙戈 : updating a record requires a callback

node.js - 删除 API 后调用的 csrf protecteion

express - express-validator isEmpty 没有错误

node.js - 配置负载均衡器路由到实例的不同页面?

amazon-ec2 - 列出与特定弹性负载均衡器关联的 EC2 实例的 AWS API 操作?

javascript - NightmareJS 在 Promise 中循环操作不等待结果

javascript - ExpressJS Multer 文件权限