À compter d'aujourd'hui, 10 octobre 2014 , en utilisant Heroku Cedar stack et ExpressJS ~ 3.4.4 , voici un ensemble de code fonctionnel.
La principale chose à retenir ici est que nous déployons sur Heroku. La résiliation SSL se produit au niveau de l'équilibreur de charge, avant que le trafic chiffré n'atteigne votre application de nœud. Il est possible de tester si https a été utilisé pour faire la requête avec req.headers ['x-forwarded-proto'] === 'https' .
Nous n'avons pas besoin de nous soucier d'avoir des certificats SSL locaux dans l'application, etc., comme vous le feriez si vous hébergez dans d'autres environnements. Cependant, vous devez d'abord appliquer un module complémentaire SSL via les modules complémentaires Heroku si vous utilisez votre propre certificat, sous-domaines, etc.
Ensuite, ajoutez simplement ce qui suit pour effectuer la redirection de tout autre chose que HTTPS vers HTTPS. C'est très proche de la réponse acceptée ci-dessus, mais:
- S'assure que vous utilisez "app.use" (pour toutes les actions, pas seulement pour obtenir)
- Externalisation explicite de la logique forceSsl dans une fonction déclarée
- N'utilise pas '*' avec "app.use" - cela a échoué lorsque je l'ai testé.
- Ici, je ne veux que du SSL en production. (Changez selon vos besoins)
Code:
var express = require('express'),
env = process.env.NODE_ENV || 'development';
var forceSsl = function (req, res, next) {
if (req.headers['x-forwarded-proto'] !== 'https') {
return res.redirect(['https://', req.get('Host'), req.url].join(''));
}
return next();
};
app.configure(function () {
if (env === 'production') {
app.use(forceSsl);
}
// other configurations etc for express go here...
}
Remarque pour les utilisateurs de SailsJS (0.10.x). Vous pouvez simplement créer une stratégie (enforceSsl.js) dans api / policies:
module.exports = function (req, res, next) {
'use strict';
if ((req.headers['x-forwarded-proto'] !== 'https') && (process.env.NODE_ENV === 'production')) {
return res.redirect([
'https://',
req.get('Host'),
req.url
].join(''));
} else {
next();
}
};
Ensuite, faites référence à config / policies.js avec toute autre politique, par exemple:
'*': ['authentifié', 'enforceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })