J'ai essayé de configurer HTTPS avec un projet node.js sur lequel je travaille. J'ai essentiellement suivi la documentation de node.js pour cet exemple:
// curl -k https://localhost:8000/
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
Maintenant, quand je fais
curl -k https://localhost:8000/
Je reçois
hello world
comme prévu. Mais si je fais
curl -k http://localhost:8000/
Je reçois
curl: (52) Empty reply from server
Rétrospectivement, cela semble évident que cela fonctionnerait de cette façon, mais en même temps, les personnes qui finissent par visiter mon projet ne vont pas taper https : // yadayada, et je veux que tout le trafic soit https à partir du moment où ils arrivent. le site.
Comment puis-je obtenir node (et Express car c'est le framework que j'utilise) pour transférer tout le trafic entrant vers https, qu'il ait été spécifié ou non? Je n'ai pu trouver aucune documentation traitant de cela. Ou est-il simplement supposé que dans un environnement de production, un nœud a quelque chose devant lui (par exemple nginx) qui gère ce type de redirection?
C'est ma première incursion dans le développement Web, alors pardonnez mon ignorance si c'est quelque chose d'évident.
Réponses:
Ryan, merci de m'avoir pointé dans la bonne direction. J'ai étoffé un peu votre réponse (2ème paragraphe) avec du code et cela fonctionne. Dans ce scénario, ces extraits de code sont placés dans mon application express:
Le serveur https express écoute ATM sur 3000. J'ai configuré ces règles iptables afin que le nœud n'ait pas à s'exécuter en tant que root:
Dans l'ensemble, cela fonctionne exactement comme je le voulais.
la source
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
if(!req.secure){}
if(req.protocol==='http')
déclarationSi vous suivez les ports conventionnels puisque HTTP essaie le port 80 par défaut et HTTPS essaie le port 443 par défaut, vous pouvez simplement avoir deux serveurs sur la même machine: Voici le code:
Tester avec https:
Avec http:
Plus de détails: Nodejs HTTP et HTTPS sur le même port
la source
res.writeHead(301, etc.)
ne fonctionnera correctement que pour les appels GET, car il301
ne dit pas au client d'utiliser la même méthode. Si vous souhaitez conserver la méthode utilisée (et tous les autres paramètres), vous devez utiliserres.writeHead(307, etc.)
. Et si cela ne fonctionne toujours pas, vous devrez peut-être effectuer un proxy. Source: http://stackoverflow.com/a/17612942/1876359Merci à ce gars: https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html
la source
app.enable('trust proxy');
app.get('X-Forwarded-Proto') != 'http'
au lieu dereq.secure
aws.amazon.com/premiumsupport/knowledge-centerAvec Nginx, vous pouvez profiter de l'en-tête "x-forwarded-proto":
la source
app.enable('trust proxy');
: "Indique que l'application se trouve derrière un proxy frontal et utiliser les en-têtes X-Forwarded- * pour déterminer la connexion et l'adresse IP du client." expressjs.com/en/4x/api.html#app.setDepuis la version 0.4.12, nous n'avons pas vraiment de moyen propre d'écouter HTTP et HTTPS sur le même port en utilisant les serveurs HTTP / HTTPS de Node.
Certaines personnes ont résolu ce problème en demandant au serveur HTTPS de Node (cela fonctionne également avec Express.js) d'écouter 443 (ou d'un autre port) et d'avoir également un petit serveur http lié à 80 et de rediriger les utilisateurs vers le port sécurisé.
Si vous devez absolument être capable de gérer les deux protocoles sur un seul port, vous devez mettre nginx, lighttpd, apache ou un autre serveur Web sur ce port et agir en tant que proxy inverse pour Node.
la source
Vous pouvez utiliser le module express-force-https :
npm install --save express-force-https
la source
app
premier. (voir cette réponse )J'utilise la solution proposée par Basarat mais j'ai aussi besoin d'écraser le port car j'avais l'habitude d'avoir 2 ports différents pour les protocoles HTTP et HTTPS.
Je préfère également utiliser un port non standard pour démarrer nodejs sans privilèges root. J'aime 8080 et 8443 parce que je viens de beaucoup d'années de programmation sur tomcat.
Mon dossier complet devient
Ensuite, j'utilise iptable pour forwording 80 et 443 trafic sur mes ports HTTP et HTTPS.
la source
Cette réponse doit être mise à jour pour fonctionner avec Express 4.0. Voici comment j'ai fait fonctionner le serveur http séparé:
la source
Si votre application se trouve derrière un proxy de confiance (par exemple, un AWS ELB ou un nginx correctement configuré), ce code devrait fonctionner:
Remarques:
la source
Je trouve que req.protocol fonctionne lorsque j'utilise express (je n'ai pas testé sans mais je soupçonne que cela fonctionne). en utilisant le nœud actuel 0.10.22 avec express 3.4.3
la source
La plupart des réponses ici suggèrent d'utiliser l'en-tête req.headers.host.
L'en-tête Host est requis par HTTP 1.1, mais il est en fait facultatif puisque l'en-tête peut ne pas être réellement envoyé par un client HTTP, et node / express acceptera cette demande.
Vous pourriez demander: quel client HTTP (par exemple: navigateur) peut envoyer une requête sans cet en-tête? Le protocole HTTP est très simple. Vous pouvez créer une requête HTTP en quelques lignes de code, pour ne pas envoyer d'en-tête d'hôte, et si chaque fois que vous recevez une requête malformée, vous lancez une exception, et selon la façon dont vous gérez ces exceptions, cela peut arrêter votre serveur.
Alors validez toujours toutes les entrées . Ce n'est pas de la paranoïa, j'ai reçu des demandes sans en-tête d'hôte dans mon service.
De plus, ne traitez jamais les URL comme des chaînes . Utilisez le module URL du nœud pour modifier des parties spécifiques d'une chaîne. Traiter les URL comme des chaînes peut être exploité de nombreuses manières. Ne fais pas ça.
la source
C'est ce que nous utilisons et cela fonctionne très bien!
la source
vous pouvez utiliser le module "net" pour écouter HTTP et HTTPS sur le même port
la source
Cela a fonctionné pour moi:
la source
Vous pouvez instancier 2 serveurs Node.js - un pour HTTP et HTTPS
Vous pouvez également définir une fonction de configuration que les deux serveurs exécuteront, de sorte que vous n'ayez pas à écrire beaucoup de code dupliqué.
Voici comment je l'ai fait: (en utilisant restify.js, mais devrait fonctionner pour express.js, ou le nœud lui-même aussi)
http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/
la source
Cela a fonctionné pour moi:
Recommander d'ajouter les en-têtes avant de rediriger vers https
Maintenant, quand vous faites:
Vous obtenez:
J'utilise express 4.17.1
la source