2012-01-14 14 views
13

Müşterilerin bir SaaS'a etki alanındaki kuruluş adlarını kullanarak erişmelerine nasıl izin verilir? Örneğin, bir web uygulaması olan example.com, OrgA ve OrbB olmak üzere 2 müşteriye sahip olabilir.Düğüm ve Express'i kullanarak müşteri/istemci stili alt etki alanları nasıl yapılır

Oturum açtıktan sonra, her müşteri kendi sitesine orga.example.com/orgb.example.com adresine yönlendirilir.

Alt etki alanını içeren istek, düğüm sunucusuna ulaştığında, isteğim, isteği tek bir '/' yolla ele almaktır. Rota işleyicisinin içinde, ana makine başlığını basitçe inceler ve alt alanı, kuruluş için bir param olarak ele alır. gibi şey:

app.get "/*", app.restricted, (req, res) -> 
    console.log "/* hit with #{req.url} from #{req.headers.host}" 
    domains = req.headers.host.split "." 
    if domains 
    org = domains[0] 
    console.log org 
    # TODO. do something with the org name (e.g. load specific org preferences) 
    res.render "app/index", { layout: "app/app" } 

NB. Alan dizisindeki ilk öğe kuruluş adıdır. Ana bilgisayar üstbilgisinde hiçbir bağlantı noktasının görünmediğini ve şimdilik, kuruluş dışı alt etki alanı adlarını (ör. Www, blog, vb.) Nasıl ele alacağımı düşünmüyorum.

Bu yüzden sahip olduğum soru, farklı ana bilgisayar başlıklarıyla istekleri işlemek için nasıl düğüm/ifade yapılandırılabileceğiyle ilgili. Bu genellikle Apache'de bir joker karakter takma adı kullanılarak veya IIS'de bir ana bilgisayar üstbilgisi kullanılarak çözülür.

bir Apache/Raylar, örneğin aynı düğümde elde edilebilir nasıl http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails

@ mı?

+0

ulaşmak için http-vekil kullanabilirsiniz ne olursa olsun verileri alır Bu belirli ana bilgisayara ihtiyaç duyar ve rotalar/ara katmanlarda kullanılmak üzere req nesnesine ekler. –

+0

Bence şu an sahip olduğum şey (henüz orta katmana taşınmamış olsa da). * .example.com'u yakalamak için bir sunucunun nasıl ayarlanacağını engelledim/açık değilim. Bir vekil düşünmek gerekli olabilir (https://github.com/nodejitsu/node-http-proxy) ama anlamaya çalışmadan önce daha fazla öğrenmem gerekiyor. Yerel olarak (OSX'de) gelişmeme izin veren bir çözüme de ihtiyacım var. – mattgi

cevap

2

Düğüm sunucunuzun IP adresi ve bağlantı noktasına ulaşan herhangi bir isteğin düğüm sunucunuz tarafından ele alınması gerektiğini düşünüyorum. Bu nedenle apache'nin apache tarafından alınıp alınma istekleri arasında ayrım yapmak için apache'de vhost'lar yaparsınız.

Alt etki alanlarını nasıl işlediğini görmek için express-subdomains kaynak koduna bakın (the source yalnızca 41 satırdır).

1

Kullanıcının siteye giriş yapabildiği ve siteyi yönetebileceği example.com ana sitesine sahip olmama rağmen benzer bir durumum vardı. Daha sonra, OrgA.example.com, oturum açmış kullanıcının durumuna göre güncellenecek, herkese açık bir site idi. example.com adresindeki eylemler.

İki ayrı uygulama oluşturmaya ve 'example.com' ile bir uygulama arasında bağlantı kurarak sanal ana bilgisayarları kurmaya başladım ve bir diğerine '*'. Here's an example nasıl yapılacağı hakkında. Eğer express.vhost kullanmak istemiyorsanız

7

, lütfen anabaşlık bakar bir ortakatmanlar yazabiliriz daha organize yönlendirme/port sistemi

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

/* 
Because of the way nodejitsu deals with ports, you have to put 
your proxy first, otherwise the first created webserver with an 
accessible port will be picked as the default. 

As long as the port numbers here correspond with the listening 
servers below, you should be good to go. 
*/ 

var proxyopts = { 
    router: { 
    // dev 
    'one.localhost': '127.0.0.1:3000', 
    'two.localhost': '127.0.0.1:5000', 
    // production 
    'one.domain.in': '127.0.0.1:3000', 
    'two.domain.in': '127.0.0.1:4000', 

    } 
} 

var proxy = require('http-proxy') 
    .createServer(proxyopts) // out port 
    // port 4000 becomes the only 'entry point' for the other apps on different ports 
    .listen(4000); // in port 


var one = express() 
    .get('/', function(req, res) { 
    var hostport = req.headers.host 
    res.end(hostport) 
}) 
.listen(3000) 


var two = express() 
    .get('/', function(req, res) { 
    res.end('I AM APP FIVE THOUSAND') 
    }) 
    .listen(5000)