Форсировать запросы через https в Express / Node - PullRequest
5 голосов
/ 15 марта 2012

У меня есть сервер Express.js (v 2.5.8) (узел v0.6.12), работающий на порту 3100. Он является интерфейсом Nginx, который передает запросы http и https на порт 3100.

Я хочу, чтобы определенные URL-адреса по https. Вот пример (приложение - мой сервер Express):

app.get('/applyNow', ensureSec, secure.showApplication );

sureSec - это функция, которую я пытаюсь использовать, чтобы проверить, установлено ли соединение через ssl:

function ensureSec(req, res, next) {
    if (req.session.ssl == true) { 
        return next(); 
    } else {
        req.session.ssl = true;
        res.redirect('https://' + url.parse(req.headers.referer).host +
        url.parse(req.url).pathname);
    }
}

Перенаправление работает, но узел (после истечения времени ожидания) выдает ошибку, говорящую `Cannot GET / applyNow

Как правильно перенаправить на ssl?

Ответы [ 7 ]

6 голосов
/ 15 марта 2012

Насколько я понимаю, вы используете nginx для согласования SSL и перенаправления запросов http и https в ваше приложение Express.Я бы решил вместо этого решить это в nginx, если это возможно, но если nginx не может знать, какие пути должны быть защищены (то есть доступны только через https), или вы хотите сделать это в вашем экспресс-приложении по какой-то другой причине, вот некоторыеинформация:

Вы должны получить X-Forwarded-Proto от nginx, установить https только тогда, когда исходным протоколом был https.Вот как это сделать в nginx:

proxy_set_header X-Forwarded-Proto https;

Я бы также переадресовал заголовок Host:

proxy_set_header Host $http_host;

В вашем экспресс-приложении проверьте это или перенаправьте на хоств заголовках и запрошенном пути (выражайте парсинг в req.path, чтобы вам не пришлось):

function ensureSec(req, res, next) {
    if (req.headers['x-forwarded-proto'] == 'https') { 
        return next(); 
    } else {
        res.redirect('https://' + req.headers.host + req.path);
    }
}
0 голосов
/ 05 мая 2014

app.enable («доверенный прокси»);

«Использование Express за обратным прокси-сервером, таким как Varnish или Nginx, тривиально, однако требует настройки. Включив параметр« доверенный прокси »через app.enable (« доверенный прокси »), Экспресс будет знать, что он сидит за прокси-сервером и что полям заголовка X-Forwarded- * можно доверять, что в противном случае может быть легко подделано. "

Экспресс за прокси доко

0 голосов
/ 10 мая 2012

Поскольку вы используете Nginx на внешнем интерфейсе, самый простой и понятный способ добиться этого - перенаправлять (переписывать) http URL-адреса в Nginx на HTTPS, а не пытаться перенаправить их в Express.Это можно сделать следующим образом:

server {
  listen 12.34.56.78:80;
  server_name yourserver.com;

  location / {
      rewrite ^ https://$server_name$request_uri permanent;
  }
}

Вы можете переписать эту строку:

rewrite ^ https://ducklington.org$request_uri permanent;

Просто настройте свое местоположение в соответствии с маршрутами или правилами, которые необходимо перенаправить на https.

0 голосов
/ 01 мая 2012

Как объясняется здесь: http://elias.kg/post/14971446990/force-ssl-with-express-js-on-heroku-nginx, с Nginx вы можете воспользоваться преимуществом заголовка "x-forwarded-proto":

function ensureSec(req, res, next){
    if (req.headers["x-forwarded-proto"] === "https"){
       return next();
    }
    res.redirect("https://" + req.headers.host + req.url);  
});
0 голосов
/ 15 марта 2012

Чтобы добавить к тому, что сказал Питер Лайонс, выразите мандат, что вы используете только один сервер в порту. Если вы попытаетесь запустить два http-сервера на одном порту, это приведет к ошибке EADDRINUSE.

0 голосов
/ 15 марта 2012

Вы можете настроить ssl-порт на вашем сервере nginx и прокси-запросы к node.js, как и другие запросы.

http://nginx.org/en/docs/http/configuring_https_servers.html

Нет необходимости менять приложение node.js. Просто настройте порт 443 на nginx с вашими сертификатами и запросами прокси к приложению node.js.

0 голосов
/ 15 марта 2012

Для этого вам нужно 2 различных экспресс-объекта app.Каждый экземпляр экспресс-сервера может одновременно прослушивать только один протокол.Все это может происходить в одном процессе node.js, но вам нужно 2 экземпляра экспресс-сервера app с различной конфигурацией, один для http, а другой для https.См. Мой ответ для примера:

Как заставить SSL / https в Express.js

См. Также: Автоматическое соединение HTTPS / перенаправление с node.js/ express ?

Также обратите внимание, что вам не следует присваивать req.session.ssl.Установка в true не делает волшебным образом, как если бы клиент соединялся с TLS вместо открытого текста HTTP.Это свойство только для чтения.Назначение этого не имеет никакого эффекта.

Вы также должны заметить, что вы не можете запускать http и https на одном порту.Вот почему http использует 80, а https использует 443.

Когда вы получаете ошибку Cannot GET /applyNow, это означает, что ваши экспресс-маршруты никогда не соответствуют пути запроса, и, следовательно, ваше промежуточное ПО ensureSec никогда не вызывалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...