2012-01-14 10 views
13

In che modo consentire ai clienti di accedere a un SaaS utilizzando il nome dell'organizzazione nel dominio?Come eseguire sottodomini in stile cliente/cliente utilizzando Nodo ed Express

Ad esempio, un'app Web, esempio.com, può avere 2 clienti, OrgA e OrbB.

Una volta effettuato l'accesso, ciascun cliente viene reindirizzato al proprio sito, orga.esempio.com/orgb.esempio.com.

Una volta che la richiesta che include il sottodominio raggiunge il server nodo, la mia speranza è quella di gestire la richiesta con un singolo percorso "/". All'interno del gestore di rotte, controlla semplicemente l'intestazione host e tratta il sottodominio come parametro per l'organizzazione. Qualcosa di simile:

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. Il primo elemento dell'array di domini è il nome dell'organizzazione. Suppongo che non sia presente alcuna porta nell'intestazione host e, per ora, non sto considerando come gestire i nomi di sottodomini non dell'organizzazione (ad esempio www, blog, ecc.).

La domanda che ho quindi riguarda più come node/express può essere configurato per gestire le richieste con diverse intestazioni host. Questo è generalmente risolto in Apache utilizzando un alias con caratteri jolly o in IIS utilizzando un'intestazione host.

un Apache/Rails esempio è @http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails

Come può lo stesso essere raggiunto nel nodo?

+0

Si potrebbe scrivere un middleware che guarda l'intestazione host, ottiene qualsiasi dato ha bisogno di quell'host specifico e aggiunge l'oggetto req da utilizzare nelle rotte/nel middleware. –

+0

Penso che quel bit sia quello che ho già (anche se non ancora trasferito al middleware). Sono bloccato/non chiaro su come configurare un server per catturare * .example.com. Penso che possa essere richiesto un proxy (https://github.com/nodejitsu/node-http-proxy) ma ho bisogno di saperne di più prima di tentare di capirlo. Ho anche bisogno della soluzione per farmi sviluppare localmente (su OSX). – mattgi

risposta

2

Penso che qualsiasi richiesta che arriva all'indirizzo IP e alla porta del proprio server nodo dovrebbe essere gestita dal proprio server nodo. Ecco perché si creano vhosts in apache, per distinguere tra le richieste che apache riceve ad esempio dal sottodominio.

Date un'occhiata al codice sorgente per express-subdomains se volete vedere come gestisce i sottodomini (the source è solo 41 linee).

1

Avevo una situazione simile, sebbene avessi il sito principale example.com in cui l'utente poteva accedere e gestire il proprio sito, quindi OrgA.example.com era un sito pubblico che doveva essere aggiornato in base all'utente registrato. azioni su example.com.

Ho finito per creare due app separate e configurare gli host virtuali all'interno della connessione al punto "esempio.com" a un'applicazione e "*" a un'altra. Here's an example su come farlo.

7

se non volete usare express.vhost, è possibile utilizzare http-proxy per realizzare un sistema di routing/porto più organizzato

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) 
Problemi correlati