2012-02-03 66 views
7

estoy sirviendo a un directorio estática, así:Redireccionar sin www a www con Node.js y expresar

var app = express.createServer(); 
app.configure(function(){ 
    app.use(express.static(__dirname + '/public')); 
}); 

Así que no estoy usando rutas en absoluto. Me gustaría redirigir example.com a www.example.com, ¿es posible usar Express?

+0

Mientras que usted puede certa Haga esto en la capa de aplicación con Express, en la mayoría de las situaciones le gustaría que su servidor web maneje esto. Eso ayudará a mantener la carga fuera de su aplicación cuando no necesita estar allí. – Brad

+0

También vea http://stackoverflow.com/questions/7013098/node-js-www-non-www-redirection –

+0

Espero que esto https://stackoverflow.com/a/39731460/1946016 trabajó para usted, Si es así, por favor acepte la respuesta – karthikdivi

Respuesta

9

Sí. Esto debería hacerlo.

var express = require("express"); 
var app = express.createServer(); 
var port = 9090; 
app.all(/.*/, function(req, res, next) { 
    var host = req.header("host"); 
    if (host.match(/^www\..*/i)) { 
    next(); 
    } else { 
    res.redirect(301, "http://www." + host); 
    } 
}); 
app.use(express.static(__dirname + "/public")); 
app.listen(port); 
+0

¿no necesita redireccionar al puerto 9090 también? – chovy

+0

necesita invertir sus argumentos res.redirect. – chovy

+0

Para Express 2.x era 'res.redirect = function (url, status) {'. Ha cambiado en 3.x para cambiar el orden. Actualizaré el ejemplo. Y normalmente hay un servidor web escuchando en el puerto 80 y un proxy inverso para expresar en un puerto diferente (9090 en este ejemplo), por lo que no desea incluir el puerto 9090 en su URL. Si express estaba sirviendo directamente a internet, entonces sí necesitaría el puerto si no estuviera usando los puertos predeterminados. –

8

Como alternativa, puede utilizar un módulo ya preparado para Express que hace exactamente lo que desea, p. nodo-fuerza-dominio.

Ver https://github.com/goloroden/node-force-domain para más detalles.

+0

Encontré este complemento para que no funcione con los puertos y http – chovy

+0

Sigamos discutiendo esto en GitHub, he visto que abriste [un problema] (https://github.com/goloroden/node-force-domain/issues/1) para eso :-) –

+1

Gracias por este módulo Golo. Para mí, Google Analytics se quejaba frecuentemente de "Nombres de host Reduntdant: para evitar este problema, considere configurar un redireccionamiento 301 de uno de sus nombres de host redundantes al otro, o cree un filtro de búsqueda y reemplazo que elimine" www. "De los nombres de host . ". Tu módulo lo resuelve perfectamente. {{los moderadores del mensaje de Google Analytics se agregaron intencionalmente aquí, ayudará a otros codificadores a encontrar este hilo fácilmente}} –

2

Puede utilizar el paquete de fuerza en el dominio expreso de NPM:

//install 
npm install express-force-domain 

///app.js 
app.all('*', require('./express-force-domain')('http://www.example.com')); 

paquete de NPM: https://npmjs.org/package/express-force-domain

+0

esta solución funciona muy bien bueno, incluso para http a https –

7

El siguiente código preservar ruta, mientras que la reorientación de

Ex: http://foo.com/foo a http://www.foo.com/foo

var app = express.createServer(); 
    self.app.all(/.*/, function(req, res, next) { 
     var host = req.header("host"); 
     if (host.match(/^www\..*/i)) { 
     next(); 
     } else { 
     res.redirect(301, "http://www." + host + req.url); 
     } 
    }); 
    app.use('/',express.static('public')); 
Cuestiones relacionadas