Express JS, как перенаправить весь http-трафик на https (Heroku) - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу, чтобы в моем приложении Express JS был механизм для перенаправления всего http-трафика в https-трафик, аналогичный конфигурации Rails force_ssl.(В случае с Rails он просто отправляет ответ Redirect клиенту

. Я думаю, что код сервера Express будет помещен в Server.js, но мне нужно отличать эти запросы от защищенных (https) запросов, которые должны идтик настоящему приложению.

Я думаю, что код перенаправления выглядит следующим образом:

var http = express.createServer();
http.get('*', function(req, res) {
  res.redirect('https://' + req.headers.host + req.url);    
})
// have it listen on 8080
http.listen(80);

Вы заметите, что я не могу прослушивать порт по номеру порта, потому что в Herokuесть дополнительное осложнение, что приложение может быть повторно развернуто, прослушивая выбранный порт приложения (оно меняется каждый раз при повторном развертывании).

, поэтому, по сути, мне нужен способ определения протокола (http или https)без использования номера порта здесь в настройке Express, а затем перенаправить http-трафик на https.

Само приложение смоделировано после «Create React App on Heroku» здесь https://originmaster.com/running-create-react-app-and-express-crae-on-heroku-c39a39fe7851,, поэтому по сути этоПриложение REACT обслуживается Express JS на Heroku.

и пример приложения здесь https://github.com/Johnnycon/crae-heroku

, где я застрял в том, что я изучил «процесс» vaи хотя он содержит много информации, он, по-видимому, не содержит никакой информации о запросе, такой как протокол или URL, по мере поступления запроса.

Какие-либо советы или предложения?

1 Ответ

0 голосов
/ 12 декабря 2018

Обычно в вашем server.js в верхней части, добавьте эту функцию:

// On Heroku, SSL termination happens at the load balancer,
// BEFORE encrypted traffic reaches your node app.
function enforceHttps(req, res, next) {
  // Check if directly requested via https
  if (req.secure) {
    next();
    // Heroku sets a header X-Forwarded-Proto to pass the user requested protocol
  } else if ((req.headers['x-forwarded-proto'] || '').substring(0, 5) === 'https') {
    next();
    // Only redirect GET and HEAD requests
  } else if (req.method === 'GET' || req.method === 'HEAD') {
    const host = req.headers['x-forwarded-host'] || req.headers.host;
    // redirect with 301 Moved Permanently instead of default 302
    res.redirect(301, `https://${host}${req.originalUrl}`);
  } else {
    res.status(403).send('This server requires an HTTPS connection.');
  }
}

, а затем в файле после того, как вы определите app, обычно как const app = express();:

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