2012-04-27 33 views
40

Estoy usando nodejs y expressjs. Me pregunto si hay algo como request.headers.protocol en el objeto clientRequest. Me gustaría construir el baseUrl para los enlaces web. Entonces, si la solicitud se realizó a través de https, me gustaría mantener https en todos los enlaces.Cómo saber si una solicitud es http o https en node.js

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

Respuesta

62

Editar: Para Express, es más seguro y se recomienda utilizar req.secure (como @Andy recomienda a continuación). Si bien utiliza una implementación similar, será seguro para uso futuro y también admite opcionalmente el encabezado X-Forwarded-Proto.

Dicho esto, para su caso de uso sería más rápido utilizar la propiedad Express 'req.protocol, que es http o https. Sin embargo, tenga en cuenta que para los enlaces salientes, puede consultar el //example.com/path, y el navegador utilizará el protocolo actual. (Véase también Can I change all my http:// links to just //?)

Para el nodo Request objeto sin expreso:

Está en req.connection.secure (booleano).

Editar: El API ha cambiado, para Nodo 0.6.15+:

una conexión HTTPS tiene req.connection.encrypted (un objeto con información sobre la conexión SSL). Una conexión HTTP no tiene req.connection.encrypted.

también (de the docs):

Con soporte HTTPS, utilice request.connection.verifyPeer() y request.connection.getPeerCertificate() para obtener detalles de autenticación del cliente.

+3

¿Aún está disponible en el último nodo 0.10 y posteriores? – CMCDragonkai

+1

Hm, puede verificar esto para versiones de nodos posteriores como 0.8 y superior, no puedo encontrar nada del tipo en la documentación. Pero podría ser que estoy leyendo en el lugar equivocado. – Olga

+0

Esto todavía existe en el nodo v5.x. – Ben

4

No necesita especificar el protocolo en la URL, por lo tanto, no necesita preocuparse por este problema.

Si usa <img src="//mysite.comm/images/image.jpg" />, el navegador usará HTTP si la página se sirve en HTTP, y usará HTTPS si la página se sirve en HTTPS. Ver the @Jukka K. Korpela explanation en otro hilo.

+1

Gracias Gerardo, tiene usted razón, pero para este proyecto que necesita para detectar el protocolo. – aartiles

+0

Pero esto no es cierto para las aplicaciones universales, en el servidor debe especificar el protocolo –

2

Esto funcionó para mí:

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

Espero que esto ayudó,

E

+2

Tenga en cuenta que esto solo funcionará si su aplicación se ejecuta detrás de un proxy inverso que establece este encabezado, lo cual es una buena idea, pero puede no ser el caso especialmente en, por ejemplo un entorno de desarrollo local. (Además, tenga en cuenta que si * no * está detrás de un proxy, un cliente podría falsificar el encabezado, así que tenga cuidado de cómo confía en él). – natevw

+0

¡También esto en algunos casos le da la ip, no el host http! –

+0

Estoy usando OpenShift, y esta es la respuesta correcta para ese servicio (req.secure y req.protocol no funcionan); Solo pensé en mencionarlo en caso de que alguien más también lo haga. – iangilman

34

req.secure es una abreviatura de req.protocol === 'https' debe ser lo que usted busca.

Si ejecuta su aplicación detrás del proxy, habilite 'trust proxy' para que req.protocol refleje el protocolo que se ha utilizado para comunicarse entre el cliente y el proxy.

app.enable('trust proxy');

+0

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

+0

oh correcto, confundido con 'require ('url'). Parse (..). Protocol' – caub

+2

Bonita llamada al mencionar' app. enable ('trust proxy'); ' No usar esto causaba un bucle de redirección. –

3

Si usted quiere saber si la solicitud es HTTP o HTTPS a continuación, utilizar esto en su código req.headers.referer.división (':') [0]; esto devolverá si se req HTTP o HTTPS

1

Si está utilizando módulo de petición y, por ejemplo, desea saber qué protocolo hace algún uso WWW, que puede utilizar: 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 necesita el protocolo de usuario, utilice request.headers.referer.split (':') [0]; al igual que @Harsh le dio.

1

Para NodeJS puros (esto funciona localmente y desplegado, por ejemplo, detrás de 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

En función:

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

var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/ 
Cuestiones relacionadas