2012-04-27 7 views

Antwort

62

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.

+3

Ist dies immer noch im neuesten Knoten 0.10 und höher? – CMCDragonkai

+1

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

+0

Dieser existiert noch in Node v5.x. – Ben

4

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.

+1

Dank Gerardo, sind Sie hier richtig, aber für dieses Projekt muß ich erkennen das Protokoll. – aartiles

+0

Aber das gilt nicht für universelle Anwendungen, auf dem Server müssen Sie das Protokoll angeben –

2

Das ist für mich gearbeitet:

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

Hope this half,

E

+2

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

+0

Auch dies gibt Ihnen in einigen Fällen die IP nicht der HTTP-Host! –

+0

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

34

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');

+0

@caub http://expressjs.com/en/api.html#req.protocol – Andy

+0

oh richtig, verwechselt mit 'require ('url'). Parse (..). Protocol' – caub

+2

Netter Anruf auf' app. enable ('trust proxy'); ' Dies nicht zu verwenden, verursachte eine Umleitungsschleife. –

3

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

1

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.

1

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]; 
} 
0

In einer Funktion:

function getBaseUrl(req) { 
    return req.protocol + '://' + req.headers.host + '/'; 
} 

var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/ 
Verwandte Themen