J'ai une application en cours d'exécution sur heroku avec express sur nœud avec https ,. Comment identifier le protocole pour forcer une redirection vers https avec nodejs sur heroku?
Mon application n'est qu'un simple serveur http, elle ne réalise pas (encore) qu'heroku lui envoie des requêtes https:
/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */
app.listen(process.env.PORT || 3000);
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })
Réponses:
À 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:
Code:
Remarque pour les utilisateurs de SailsJS (0.10.x). Vous pouvez simplement créer une stratégie (enforceSsl.js) dans api / policies:
Ensuite, faites référence à config / policies.js avec toute autre politique, par exemple:
la source
res.redirect
cela par défaut est une redirection 302 (au moins dans express 4.x). Pour des raisons de référencement et de mise en cache, vous souhaitez probablement une redirection 301 à la place. Remplacez la ligne correspondante parreturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
Express 4.x
, retirez laapp.configure
ligne et utilisez simplement la potion intérieure.app.configure
est un code hérité et n'est plus inclus dans express.La réponse est d'utiliser l'en-tête de 'x-forwarded-proto' que Heroku transmet comme il le fait pour le proxy thingamabob. (note latérale: ils transmettent également plusieurs autres variables x qui peuvent être utiles, vérifiez-les ).
Mon code:
Merci Brandon, j'attendais juste ce retard de 6 heures qui ne me permettrait pas de répondre à ma propre question.
la source
GET
?&& process.env.NODE_ENV === "production"
à votre conditionnel si vous souhaitez qu'il fonctionne uniquement dans votre environnement de production.La réponse acceptée contient un domaine codé en dur, ce qui n'est pas très bon si vous avez le même code sur plusieurs domaines (par exemple: dev-yourapp.com, test-yourapp.com, yourapp.com).
Utilisez plutôt ceci:
https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/
la source
req.hostname
par lareq.headers.host
version peut-être express que je suis en 4.2J'ai écrit un petit module de nœud qui applique SSL sur les projets express. Il fonctionne à la fois dans des situations standard et en cas de reverse proxies (Heroku, nodejitsu, etc.)
https://github.com/florianheinemann/express-sslify
la source
Si vous souhaitez tester l'en-
x-forwarded-proto
tête sur votre hôte local, vous pouvez utiliser nginx pour configurer un fichier vhost qui envoie par proxy toutes les demandes à votre application de nœud. Votre fichier de configuration nginx vhost pourrait ressembler à ceciNginX
Les éléments importants ici sont que vous transmettez par proxy toutes les demandes au port localhost 3000 (c'est là que votre application de nœud s'exécute) et que vous configurez un tas d'en-têtes, y compris
X-Forwarded-Proto
Ensuite, dans votre application, détectez cet en-tête comme d'habitude
Express
Koa
Hôtes
Enfin, vous devez ajouter cette ligne à votre
hosts
fichierla source
Vous devriez jeter un oeil à heroku-ssl-redirect . Il fonctionne comme un charme!
la source
Si vous utilisez cloudflare.com comme CDN en combinaison avec heroku, vous pouvez activer la redirection SSL automatique dans cloudflare facilement comme ceci:
Connectez-vous et accédez à votre tableau de bord
Sélectionnez les règles de la page
la source
Les utilisateurs de bouclage peuvent utiliser une version légèrement adaptée de arcseldon answer comme middleware:
serveur / middleware / forcessl.js
serveur / serveur.js
la source
C'est une manière plus spécifique de faire ceci.
la source
la source
Avec app.use et URL dynamique. Fonctionne à la fois localement et sur Heroku pour moi
la source
Vérifier le protocole dans l'en-tête X-Forwarded-Proto fonctionne bien sur Heroku, tout comme Derek l'a souligné. Pour ce que ça vaut, voici un aperçu du middleware Express que j'utilise et de son test correspondant.
la source