2011-04-26 23 views
48

Jestem przyzwyczajony do pracy nad httpd (Apache), który zapewnia sposób konfigurowania poddomen mapowanych do katalogu. Jak mogę zrobić to samo w Connect.js/Express.js? Widzę, że jedyne, co mam, to trasy, których nie jestem pewien, w jaki sposób mogę skonfigurować subdomeny. Mam subdomeny takie jak m.mysite.com, sync.mysite.comJak mogę skonfigurować wiele domen podrzędnych w Express.js lub Connect.js

Czy ktoś może pomóc?

+0

Przyjęta odpowiedź powinna zostać zaktualizowana, ponieważ alternatywna odpowiedź jest znacznie lepszym rozwiązaniem tego problemu. –

Odpowiedz

104

Lub alternatywnie można użyć vhost.

Następnie utwórz kilka witryn w swoim własnym katalogu i wyeksportuj aplikację ekspresową, np. /path/to/m/index.js:

var app = express() 
/* whatever configuration code */ 
exports.app = app 
// There is no need for .listen() 

a następnie obsługiwać wszystkie wnioski z następującym app:

var vhost = require('vhost'); 

express() 
.use(vhost('m.mysite.com', require('/path/to/m').app)) 
.use(vhost('sync.mysite.com', require('/path/to/sync').app)) 
.listen(80) 

Należy zauważyć, że /path/to/m i /path/to/sync może ścieżek bezwzględnych (jak napisano wyżej) lub względnie drogi.

+0

Wydaje się, że to znacznie czystszy i czystszy sposób na uzyskanie subdomeny z ekspresowym. – btleffler

+0

A następnie, co powinno być w/path/to/m i/path/to/sync? Kolejna ekspresowa aplikacja, jak zwykle? – Costa

+0

Tak, @ Costa. Każde mapowanie vhostów powinno wskazywać na aplikację ekspresową. – ekillaby

17

Możesz dołączyć subdomenę do żądania, a następnie sprawdzać w kolejnych wywołaniach next().

mam następujący kod>http://groups.google.com/group/express-js/browse_thread/thread/b04bbaea7f0e8eed (tak pełnego kredytu do pierwotnego autora)

app.get('*', function(req, res, next){ 
    if(req.headers.host == 'some.sub.domain.com') //if it's a sub-domain 
    req.url = '/mysubdomain' + req.url; //append some text yourself 
    next(); 
}); 

// This will mean that all get requests that come from the subdomain will get 
// /subdomain appended to them, so then you can have routes like this 
app.get('/blogposts', function(){ 
    // for non-subdomain 
}); 

app.get('/mysubdomain/blogposts', function(){ 
    // for subdomain 
}); 
6

stworzyłem moduł do pomocy z subdomen w Express: https://github.com/WilsonPage/express-subdomain-handler

+0

Witam, twój poddomain-handler wygląda interesująco. W jaki sposób mogę użyć tego z powiedzą "dev.localhost"? Co jeszcze musiałbym zmienić oprócz "baseUrl: localhost", z przykładu, który napisałeś, nie wynika jasno. Dzięki. – braitsch

+0

Jeśli używasz go lokalnie, musisz upewnić się, że subdomena, której używasz, jest wymieniona w pliku "hostów" Twojego komputera. Podczas produkcji możesz ustawić subdomenę z symbolami wieloznacznymi, dzięki czemu nie będziesz musiał wymieniać każdej poddomeny, której potrzebujesz. Zwykle używam formatu: subdomain.mysite.dev (lokalnie) i subdomain.mysite.com (w produkcji). – wilsonpage

10

Niedawno natknąłem się na ten problem, i napisał moduł aby pomóc go za pomocą wyraźnej 4. https://www.npmjs.org/package/express-subdomain.

Przykład - subdomena api.

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

var router = express.Router(); 

//api specific routes 
router.get('/', function(req, res) { 
    res.send('Welcome to our API!'); 
}); 

router.get('/users', function(req, res) { 
    res.json([ 
     { name: "Brian" } 
    ]); 
}); 

app.use(subdomain('api', router)); 
app.listen(3000); 

Sprawdź moduł na npm, aby zobaczyć więcej przykładów.

+2

Świetny moduł, działa pięknie. Dziękuję Ci! – Jon

+2

To wydaje się po prostu określać trasy dla subdomeny - jak ponownie określasz trasy dla domeny głównej? – fatuhoku