A partir d'aujourd'hui, 10 octobre 2014 en utilisant Pile Cedar de Heroku y ExpressJS ~3.4.4 Voici un jeu de code fonctionnel.
La principale chose à retenir ici est que nous sommes en train de déployer sur Heroku. La terminaison SSL se produit au niveau de l'équilibreur de charge, avant que le trafic crypté n'atteigne votre application node. 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 pourriez le faire si vous hébergez dans d'autres environnements. Cependant, vous devriez d'abord faire appliquer un module complémentaire SSL via les modules complémentaires de Heroku si vous utilisez votre propre certificat, des sous-domaines, etc.
Il suffit ensuite d'ajouter ce qui suit pour effectuer la redirection de tout ce qui n'est pas HTTPS vers HTTPS. Ceci est très proche de la réponse acceptée ci-dessus, mais :
- Assurez-vous que vous utilisez "app.use" (pour toutes les actions, pas seulement get)
- Externalise explicitement la logique de forceSsl dans une fonction déclarée.
- N'utilise pas '*' avec "app.use" - cela a échoué lorsque j'ai testé.
- Ici, je ne veux SSL qu'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...
});
Note pour les utilisateurs de SailsJS (0.10.x). Vous pouvez simplement créer une politique (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();
}
};
Puis référence à partir de config/policies.js avec toute autre politique, par ex :
'*' : ['authentifié', 'enforceSsl']
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 ?
0 votes
J'ai simplement utilisé cloudflare comme serveur de noms qui fonctionne comme nginx, et me permet de rediriger vers la version ssl juste en cliquant sur le bouton de basculement. vous pouvez également faire ceci : developer.mozilla.org/fr/US/docs/Web/HTTP/Headers/ De plus, généralement, personne n'envoie de données tout de suite, ils atterrissent généralement sur le formulaire puis le soumettent. Donc, côté serveur, le code, le serveur DNS, l'en-tête http, le javascript, vous pouvez vérifier et rediriger vers https. developer.mozilla.org/fr/US/docs/Web/HTTP/Redirections