2012-02-03 4 views
7

sto servendo una directory statica in questo modo:Redirect non www a www con Node.js ed esprimere

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

Quindi io non sto usando percorsi a tutti. Vorrei reindirizzare example.com a www.example.com, è possibile utilizzare Express?

+0

Mentre è possibile esegui tutto questo a livello di applicazione con Express, nella maggior parte dei casi vorresti consentire al tuo server web di gestirlo. Ciò contribuirà a mantenere il carico fuori dall'applicazione quando non è necessario che ci sia. – Brad

+0

Vedi anche http://stackoverflow.com/questions/7013098/node-js-www-non-www-redirection –

+0

Spero che questo https://stackoverflow.com/a/39731460/1946016 abbia funzionato per te, Se sì, per favore accetta la risposta – karthikdivi

risposta

9

Sì. Questo dovrebbe farlo.

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

non è necessario reindirizzare anche alla porta 9090? – chovy

+0

è necessario invertire gli argomenti res.redirect. – chovy

+0

Per express 2.x era 'res.redirect = function (url, status) {'. È cambiato in 3.x per scambiare l'ordine. Aggiornerò l'esempio E in genere c'è un server Web in ascolto sulla porta 80 e il proxy inverso per esprimere su una porta diversa (9090 in questo esempio), quindi non si desidera includere la porta 9090 nel proprio URL. Se express stava servendo direttamente su Internet, allora sì, avresti bisogno della porta se non usassi le porte predefinite. –

8

In alternativa, è possibile utilizzare un modulo già pronto per Express che fa esattamente ciò che si desidera, ad es. node-forza-dominio.

Vedere https://github.com/goloroden/node-force-domain per dettagli.

+0

Ho trovato questo plugin non funziona con le porte e http – chovy

+0

Continuiamo a discuterne su GitHub, ho visto che hai aperto [un problema] (https://github.com/goloroden/node-force-domain/issues/1) per questo :-) –

+1

Grazie per questo modulo Golo. Per me, Google Analytics si lamentava spesso di "Hostname Reduntdant - Per evitare questo problema, prendi in considerazione l'impostazione di un reindirizzamento 301 da uno dei tuoi nomi host ridondanti all'altro o crea un filtro Cerca-e-Sostituisci che rimuove" www. "Dai nomi host . ". Il tuo modulo lo risolve perfettamente. {{moderatori messaggio google analytics aggiunto intenzionalmente qui, aiuterà gli altri programmatori a trovare questo thread facilmente}} –

2

È possibile utilizzare pacchetto espresso-forza-dominio da NPM:

//install 
npm install express-force-domain 

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

Package su NPM: https://npmjs.org/package/express-force-domain

+0

questa soluzione funziona molto bene, anche per http a https –

7

Il seguente codice conserva percorso durante il reindirizzamento

Es: http://foo.com/foo per 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'));