109 votes

Heroku NodeJS http vers https ssl redirection forcée

J'ai une application en cours d'exécution sur Heroku avec Express.js sur Node.js avec https . Comment puis-je identifier le protocole pour forcer une redirection vers https avec Node.js sur Heroku ?

Mon application est juste un simple http -le serveur, il ne réalise pas (encore) que Heroku l'envoie. https -Demandes :

// Heroku provides the port they want you on in this environment variable (hint: it's not 80)
app.listen(process.env.PORT || 3000);

8 votes

Le support Heroku a répondu à ma question ci-dessus, et je n'ai pas trouvé de réponse déjà postée ici, alors j'ai pensé la poster en public et partager les connaissances. Ils transmettent beaucoup d'informations sur la requête originale avec ses en-têtes de requête préfixés par un 'x-'. Voici le code que j'utilise actuellement (en haut de mes définitions de route) : app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })

1 votes

Ok j'ai compris que vous vérifiez pour https comme ça et redirigez si nécessaire. Mais y a-t-il un moyen de faire une redirection au niveau du DNS avec votre fournisseur de nom de domaine ? Ainsi, avant que le navigateur ne résolve le DNS, il est déjà en https. Parce qu'avec cette approche, je pense, étant donné ma connaissance des redirections, qu'une demande est faite sur http puis à nouveau sur https. Donc si des données sensibles ont été envoyées, elles ont été envoyées sur http une fois, puis sur https. Ce qui va à l'encontre du but recherché. S'il vous plaît laissez-moi savoir si je me trompe.

0 votes

@MuhammadUmer, votre raisonnement semble pointé du doigt ici, en avez-vous découvert davantage ?

0voto

Chiedo John Points 496
app.all('*',function(req,res,next){
  if(req.headers['x-forwarded-proto']!='https') {
    res.redirect(`https://${req.get('host')}`+req.url);
  } else {
    next(); /* Continue to other routes if we're not redirecting */
  }
});

0voto

tuancharlie Points 71

Avec app.use et url dynamique. Cela fonctionne à la fois localement et sur Heroku pour moi.

app.use(function (req, res, next) {
  if (req.header('x-forwarded-proto') === 'http') {
    res.redirect(301, 'https://' + req.hostname + req.url);
    return
  }
  next()
});

-1voto

Peter Marklund Points 359

La vérification du protocole dans l'en-tête X-Forwarded-Proto fonctionne bien sur Heroku, comme l'a souligné Derek. Pour ce que ça vaut, voici l'essentiel du middleware Express que j'utilise et du test correspondant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X