Как принудительно заставить node.js / express.js использовать HTTPS, когда он работает за балансировщиком нагрузки AWS - PullRequest
24 голосов
/ 27 января 2012

Я работаю на узле / экспресс-службе в AWS и развернул ELB перед ним.Когда я запускаю экземпляр ELB с включенным SSL, он работает для первой страницы, на которую я попал, но затем переключается на HTTP для каждого доступа к серверу после этого.

Правило маршрутизации на ELB завершает SSL и пересылаетна порт 8080, который узел прослушивает.

Решение для терминации SSL будет хорошо работать для моих целей, но как я могу сохранить последующие серверные вызовы по HTTPS?

1 Ответ

56 голосов
/ 13 июля 2013

У меня возникла та же проблема, но в несколько ином контексте.Я развертывал приложение 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();
});

Надеюсь, это поможет!

...