node.js express + aws elb - 从 http 重定向到 https 不工作
node.js express + aws elb - redirect from http to https not working
我知道这个问题已经在这里被询问和回答,但仍然没有解决方案对我有用。这是 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
如其他帖子所述,我在请求 headers 中没有看到 'x-forwarded-proto'。我相信侦听器已正确配置,因此它们应该包含 'x-forwarded' headers 但事实并非如此。
当我尝试在没有 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();
}
}
我们将此代码用于 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());
我们的博客 post 中有更多关于此的信息:
https://snowball.digital/blog/force-https-behind-elastic-load-balancer-on-a-nodejs-application
我知道这个问题已经在这里被询问和回答,但仍然没有解决方案对我有用。这是 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
如其他帖子所述,我在请求 headers 中没有看到 'x-forwarded-proto'。我相信侦听器已正确配置,因此它们应该包含 'x-forwarded' headers 但事实并非如此。
当我尝试在没有 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();
}
}
我们将此代码用于 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());
我们的博客 post 中有更多关于此的信息: https://snowball.digital/blog/force-https-behind-elastic-load-balancer-on-a-nodejs-application