web-dev-qa-db-fra.com

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'objet clientRequest. Je voudrais construire la baseUrl pour les liens Web. Donc, si la demande a été faite via https, je souhaite conserver https dans tous les liens.

    var baseUrl = request.headers.protocol + request.headers.Host;
43
aartiles

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

Cela étant dit, dans votre cas d'utilisation, il serait plus rapide d'utiliser Express ' req.protocol property, qui est soit http, soit 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 changer tous mes http: // liens en seulement //? )

Pour un objet noeud Request 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 objet avec des informations sur la connexion SSL). Une connexion HTTP n'a pas req.connection.encrypted.

Aussi (de les docs ):

Avec le support HTTPS, utilisez request.connection.verifyPeer () et request.connection.getPeerCertificate () pour obtenir les détails de l'authentification du client.

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 <img src="//mysite.comm/images/image.jpg" />, le navigateur utilisera HTTP si la page est servie en HTTP et utilisera HTTPS si la page est servie en HTTPS. Voir l'explication de @Jukka K. Korpela dans un autre fil.

5
Gerardo Lima

Si vous voulez savoir si request est http ou https, utilisez ceci dans votre code req.headers.referer.split (':') [0]; cela retournera si req est http ou https

4
Harsh

Pour NodeJS pur (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];
}
2
tjklemz

Cela a fonctionné pour moi:

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

J'espère que cela a aidé,

E

1
user1910814

Si vous utilisez le module de requête et souhaitez par exemple connaître le protocole utilisé par 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 du protocole utilisateur, utilisez request.headers.referer.split (':') [0]; juste comme @Harsh vous a donné.

1
b4rtekb

C'est ce qui fonctionne pour moi:

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