У меня возникла та же проблема, но в несколько ином контексте.Я развертывал приложение Node.js / Express с использованием AWS Elastic Beanstalk и смог установить на него сертификат SSL.
В результате этого мое приложение было доступно как по протоколу http, так и по протоколу https.Таблица маршрутизации балансировщика нагрузки выглядела следующим образом:
(Load balancer) http 80 --> (Node instance) http 8080
(Load balancer) https 443 --> (Node instance) http 8080
Поэтому вопрос состоял в том, чтобы авторизовать только https-соединение в моем приложении node.js, но разрешить перенаправление на https, если соединение было выполнено изначально с использованием http.
Поскольку за балансировщиком нагрузки AWS вся связь осуществляется через http, команда глобального перенаправления (в данном случае промежуточное программное обеспечение), как эта, создаст бесконечный цикл перенаправления:
app.use(function(req, res, next) {
if((!req.secure) && (req.protocol !== 'https')) {
res.redirect('https://' + req.get('Host') + req.url);
}
}
-> просто потому, что инструкция (req.protocol !== 'https'
) всегда будет верной!
Из этого поста в блоге (http://matthew.mceachen.us/blog/howto-force-https-with-amazon-elastic-load-balancer-and-apache-1071.html), выясняется, что AWS ELB добавляет X-Forwarded-Прото-заголовок, который вы можете записать, чтобы узнать, какой протокол использовался до балансировки нагрузки (http или https).
Итак, это небольшое изменение помогло:
app.use(function(req, res, next) {
if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) {
res.redirect('https://' + req.get('Host') + req.url);
}
else
next();
});
Надеюсь, это поможет!