Ich benutze nodejs und expressjs. Ich frage mich, ob es so etwas wie request.headers.protocol
im ClientRequest-Objekt gibt. Ich möchte die BaseUrl für die Weblinks erstellen. Also, wenn die Anfrage über https gemacht wurde, möchte ich https in allen Links halten.Wie zu wissen, ob eine Anfrage http oder https in node.js ist
Antwort
Bearbeiten: Für Express ist es sicherer und empfohlen, req.secure
zu verwenden (wie @Andy unten empfiehlt). Während es eine ähnliche Implementierung verwendet, ist es sicher für die zukünftige Verwendung und unterstützt optional auch den Header X-Forwarded-Proto
.
Für Ihren Anwendungsfall wäre es schneller Express 'req.protocol
Eigenschaft, die entweder http
oder https
ist. Beachten Sie jedoch, dass Sie für ausgehende Links nur auf //example.com/path
verweisen können und der Browser das aktuelle Protokoll verwendet. (Siehe auch Can I change all my http:// links to just //?)
Für Knoten Request
Objekt ohne Express:
Es ist in req.connection.secure
(boolean).
Edit: Die API geändert hat, für Node 0.6.15+:
eine HTTPS-Verbindung hat req.connection.encrypted
(ein Objekt mit Informationen über die SSL-Verbindung). Eine HTTP-Verbindung hat keine req.connection.encrypted
.
auch (von the docs):
Mit HTTPS-Unterstützung verwenden request.connection.verifyPeer() und request.connection.getPeerCertificate() die Client-Authentifizierungsdaten zu erhalten.
Sie müssen das Protokoll nicht in URL angeben, daher müssen Sie sich nicht mit diesem Problem befassen.
Wenn Sie <img src="//mysite.comm/images/image.jpg" />
verwenden, verwendet der Browser HTTP, wenn die Seite in HTTP bedient wird, und verwendet HTTPS, wenn die Seite in HTTPS bereitgestellt wird. Siehe the @Jukka K. Korpela explanation in einem anderen Thread.
Dank Gerardo, sind Sie hier richtig, aber für dieses Projekt muß ich erkennen das Protokoll. – aartiles
Aber das gilt nicht für universelle Anwendungen, auf dem Server müssen Sie das Protokoll angeben –
Das ist für mich gearbeitet:
req.headers['x-forwarded-proto']
Hope this half,
E
Beachten Sie, dass dies nur funktioniert, wenn Ihre App hinter einem Reverse Proxy läuft, der diesen Header setzt - was eine gute Idee ist, aber möglicherweise nicht besonders in zB eine lokale Entwicklungsumgebung. (Denken Sie auch daran, dass, wenn Sie * nicht * hinter einem Proxy sind, ein Client den Header fälschen könnte, also seien Sie vorsichtig, wie Sie ihm vertrauen.) – natevw
Auch dies gibt Ihnen in einigen Fällen die IP nicht der HTTP-Host! –
Ich verwende OpenShift, und das ist die richtige Antwort für diesen Dienst (req.Secure und req.protocol funktionieren nicht); dachte nur, ich würde erwähnen, falls jemand anderes auch ist. – iangilman
req.secure
eine Abkürzung für req.protocol === 'https'
sollte, ist das, was Sie suchen.
Wenn Sie Ihre App hinter dem Proxy ausführen, aktivieren Sie "Trust Proxy", sodass req.protocol
das Protokoll widerspiegelt, das für die Kommunikation zwischen Client und Proxy verwendet wurde.
app.enable('trust proxy');
Wenn Sie wissen wollen, ob Anfrage http oder https diese dann req.headers.referer in Ihrem Code verwenden.split (':') [0]; dies wird zurückkehren, ob req wird http oder https
Wenn Sie Anforderungsmodul verwenden und zum Beispiel wissen wollen, welches Protokoll einige www Verwendung der Fall ist, können Sie: 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
}
});
Wenn Sie ein Benutzerprotokoll benötigen, verwenden Sie request.headers.referer.split (':') [0]; wie @Harsh gab Ihnen.
Für reinen NodeJS (dies funktioniert lokal und im Einsatz, zB hinter 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];
}
In einer Funktion:
function getBaseUrl(req) {
return req.protocol + '://' + req.headers.host + '/';
}
var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/
Ist dies immer noch im neuesten Knoten 0.10 und höher? – CMCDragonkai
Hm, können Sie dies für spätere Knotenversionen wie 0.8 und höher überprüfen, ich kann nichts von der Art in der Dokumentation finden. Aber es könnte sein, dass ich an der falschen Stelle lese. – Olga
Dieser existiert noch in Node v5.x. – Ben