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 ?

6voto

Julien Le Coupanec Points 3142

Vous devriez jeter un coup d'œil à heroku-ssl-redirect . Il fonctionne comme un charme !

var sslRedirect = require('heroku-ssl-redirect');
var express = require('express');
var app = express();

// enable ssl redirect
app.use(sslRedirect());

app.get('/', function(req, res){
  res.send('hello world');
});

app.listen(3000);

4voto

Ben Marten Points 893

Si vous utilisez cloudflare.com comme CDN en combinaison avec heroku, vous pouvez activer la redirection automatique ssl dans cloudflare facilement comme ceci :

  1. Connectez-vous et allez dans votre tableau de bord

  2. Sélectionner les règles de la page

    Select Page Rules

  3. Ajoutez votre domaine, par exemple www.example.com et mettez le paramètre "always use https" à "on". Switch always use https to on

3voto

Bunker Points 978

Les utilisateurs de Loopback peuvent utiliser une version légèrement adaptée de la réponse arcseldon comme intergiciel :

serveur/middleware/forcessl.js

module.exports = function() {  
  return function forceSSL(req, res, next) {
    var FORCE_HTTPS = process.env.FORCE_HTTPS || false;
      if (req.headers['x-forwarded-proto'] !== 'https' && FORCE_HTTPS) {
        return res.redirect(['https://', req.get('Host'), req.url].join(''));
      }
      next();
    };
 };

serveur/serveur.js

var forceSSL = require('./middleware/forcessl.js');
app.use(forceSSL());

2voto

denixtry Points 1825

Il s'agit d'une méthode plus spécifique à l'Express.

app.enable('trust proxy');
app.use('*', (req, res, next) => {
  if (req.secure) {
    return next();
  }
  res.redirect(`https://${req.hostname}${req.url}`);
});

1voto

user2959707 Points 11

J'utilise Vue, Heroku et j'ai eu le même problème :

J'ai mis à jour mon server.js comme ci-dessous, et je n'y touche plus car il fonctionne :) :

const serveStatic = require('serve-static')
const sts = require('strict-transport-security');
const path = require('path')

var express = require("express");

require("dotenv").config();
var history = require("connect-history-api-fallback");

const app = express()
const globalSTS = sts.getSTS({'max-age':{'days': 365}});
app.use(globalSTS);

app.use(
  history({
    verbose: true
  })
);

app.use((req, res, next) => {
  if (req.header('x-forwarded-proto') !== 'https') {
    res.redirect(`https://${req.header('host')}${req.url}`)
  } else {
    next();
  }
});

app.use('/', serveStatic(path.join(__dirname, '/dist')));
app.get(/.*/, function (req, res) {
res.sendFile(path.join(__dirname, '/dist/index.html'))
})

const port = process.env.PORT || 8080
app.listen(port)
console.log(`app is listening on port: ${port}`)

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