Comment savoir si une requête est http ou https dans node.js

J’utilise nodejs et expressjs. Je me demande s’il existe quelque chose comme request.headers.protocol dans l’object clientRequest. Je voudrais construire la baseUrl pour les liens Web. Donc, si la demande a été faite via https, je voudrais garder https dans tous les liens.

  var baseUrl = request.headers.protocol + request.headers.host; 

Edit: Pour Express, il est plus sûr et recommandé d’utiliser req.secure (comme le recommande @Andy ci-dessous). Bien qu’il utilise une implémentation similaire, il sera sécurisé pour une utilisation future et prend également en charge éventuellement l’en X-Forwarded-Proto tête X-Forwarded-Proto .

Cela étant dit, pour votre cas d’utilisation, il serait plus rapide d’utiliser la propriété req.protocol Express, qui est http ou https . Notez, cependant, que pour les liens sortants, vous pouvez simplement vous référer à //example.com/path et le navigateur utilisera le protocole actuel. (Voir aussi Puis-je modifier tous mes liens http: // vers //? )

Pour le noeud Request object sans Express:

C’est dans req.connection.secure (booléen).

Edit: L’API a changé pour Node 0.6.15+ :

Une connexion HTTPS a req.connection.encrypted (un object avec des informations sur la connexion SSL). Une connexion HTTP n’a pas req.connection.encrypted .

Aussi (à partir des docs ):

Avec la prise en charge HTTPS, utilisez request.connection.verifyPeer () et request.connection.getPeerCertificate () pour obtenir les détails d’authentification du client.

req.secure est un raccourci pour req.protocol === 'https' devrait être ce que vous cherchez.

Si vous exécutez votre application derrière un proxy, activez ‘proxy proxy’ pour que req.protocol reflète le protocole utilisé pour communiquer entre le client et le proxy.

app.enable('trust proxy');

Vous n’avez pas besoin de spécifier le protocole dans l’URL, vous n’avez donc pas besoin de vous préoccuper de ce problème.

Si vous utilisez le navigateur utilisera HTTP si la page est servie en HTTP et utilisera HTTPS si la page est servie en HTTPS. Voir l’explication @Jukka K. Korpela dans un autre sujet.

Si vous voulez savoir si la requête est http ou https, utilisez-la dans votre code req.headers.referer.split (‘:’) [0]; cela retournera si req est http ou https

Cela a fonctionné pour moi:

 req.headers['x-forwarded-proto'] 

J’espère que cela a aidé,

E

Si vous utilisez un module de requête et que vous souhaitez par exemple savoir quel protocole utilise le www, vous pouvez utiliser: response.request.uri.protocol

 request(YOUR_TARGET, function(error, response, body){ if (error){ console.log(error); } else { console.log(response.request.uri.protocol); // will show HTTP or HTTPS } }); 

Si vous avez besoin d’un protocole utilisateur, utilisez request.headers.referer.split (‘:’) [0]; tout comme @Harsh vous a donné.

Pour les NodeJS purs (cela fonctionne localement et déployé, par exemple derrière Nginx):

 function getProtocol (req) { var proto = req.connection.encrypted ? 'https' : 'http'; // only do this if you trust the proxy proto = req.headers['x-forwarded-proto'] || proto; return proto.split(/\s*,\s*/)[0]; } 

C’est ce qui fonctionne pour moi:

 getAPIHostAndPort = function(req, appendEndSlash) { return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : ''); } 

Dans une fonction:

 function getBaseUrl(req) { return req.protocol + '://' + req.headers.host + '/'; } var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/