2012-05-22 11 views
22

Estoy ejecutando un servidor node.js express 3 sin proxy y usando SSL.Forzar SSL con expressjs 3

Estoy tratando de averiguar cómo forzar todas las conexiones para pasar por https.

Google búsqueda me muestra esto:

https://groups.google.com/forum/#!topic/express-js/Bm6yozgoDSY

No tenemos manera de forzar https redirecciones, a pesar de que parece como un poco de una extraña solución temporal. Tenemos un https-única aplicación y sólo hay un simple ~ 4 servidor http nodo línea que vuelve a dirigir, nada de fantasía

¿Qué es lo que necesito, pero no dice lo que esas 4 líneas son.

¿Cómo hacemos esto? Gracias.

Respuesta

62

yo no entiendo muy bien el punto de partida en dos servidores cuando sólo uno puede hacer el trabajo perfectamente. Por ejemplo, mediante la adición de un middleware simple en su archivo de servidor:

app.use(function(req, res, next) { 
    if(!req.secure) { 
    return res.redirect(['https://', req.get('Host'), req.url].join('')); 
    } 
    next(); 
}); 

Esto redirigir cualquier solicitud no seguro a la página correspondiente de HTTPS. Por ejemplo, http://example.com/ a https://example.com/ y http://example.com/foo?bar=woo a https://example.com/foo?bar=woo. Este es definitivamente el comportamiento que esperaría. Tal vez deberías filtrar esto por el host, por lo que redirige solo en los dominios que posees e instaló un certificado adecuado.

Si su aplicación se ejecuta detrás de otro servidor como Nginx, es posible que desee agregar el parámetro de configuración app.set('trust proxy', true). O, mejor aún, haz que Nginx haga el redireccionamiento, que será más eficiente que cualquier aplicación de Node.js.

Editar: De acuerdo con mis puntos de referencia, join es un poco más rápido que + para concatenar cadenas. Nada espectacular, pero cada victoria es una victoria ...

+2

Lo probé y parece que todavía necesita crear un servidor http para que esto funcione, básicamente 2 servidores. Lo cual está bien, y esta respuesta funciona. – Harry

+0

Es cierto. Quise decir dos piezas de código diferentes, disculpe la confusión. O bien, solo una aplicación con algún servidor proxy/equilibrador de carga =) – Pierre

+0

@prx La edición que sugirió se rechazó porque debe publicarse como una nueva respuesta en lugar de una edición de una respuesta existente. –

0

Debe crear un segundo servidor escucha en el 80 y redirigir con una cabecera 301 a su servidor https:

var express = require('express'); 
var app = express(); 

app.get('/', function(req, res, next){ 
    res.redirect('https://' + app.address().address) 
}); 

app.listen(80); 
+1

que redirigiría todo el tráfico, incluso los https existentes? – Harry

+2

Esto definitivamente puede funcionar, pero este enfoque no funciona si el usuario solicita otra página que "/". En este caso, recibirá un error 404 molesto. – Pierre