2012-01-14 12 views
13

Как разрешить клиентам доступ к SaaS с использованием имени своей организации в домене?Как сделать субдомены типа клиента/клиента с помощью узла и экспресс-памяти

Например, веб-приложение example.com может иметь 2 клиентов, OrgA и OrbB.

После входа в систему каждый клиент перенаправляется на свой сайт, orga.example.com/ orgb.example.com.

Как только запрос, который включает субдомен, достигнет узла сервера, я надеюсь обработать запрос одним маршрутом '/'. Внутри обработчика маршрутов он просто проверяет заголовок хоста и рассматривает субдомен как параметр для организации. Кое-что вроде:

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. Первым элементом массива доменов является имя организации. Я предполагаю, что ни один порт не появляется в заголовке хоста, и пока я не рассматриваю, как обрабатывать неабонентские поддомены (например, www, blog и т. Д.).

Вопрос, который у меня есть, связан скорее с тем, как node/express можно настроить для обработки запросов с различными заголовками хостов. Это обычно решается в Apache с использованием подстановочного псевдонима или в IIS с использованием заголовка узла.

An Apache/Rails пример @http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails

Как можно же быть достигнуто в узле?

+0

Вы можете написать промежуточное программное обеспечение, который смотрит на заголовок узла, получает все данные, он нужен для этого конкретного хоста и добавляет объект req для использования в маршрутах/промежуточном программном обеспечении. –

+0

Я думаю, что бит - это то, что у меня уже есть (хотя оно еще не перешло в промежуточное ПО). Я заблокирован/неясно, как настроить сервер для catch * .example.com. Я думаю, что прокси-сервер может потребоваться (https://github.com/nodejitsu/node-http-proxy), но мне нужно узнать больше, прежде чем пытаться его понять. Мне также нужно решение, позволяющее мне развиваться локально (на OSX). – mattgi

ответ

2

Я думаю, что любой запрос, который поступает на IP-адрес и порт вашего узла, должен обрабатываться вашим сервером узлов. Вот почему вы делаете vhosts в apache, чтобы различать запросы, которые apache получает, например, поддоменом.

Посмотрите на исходный код для express-subdomains, если вы хотите увидеть, как он обрабатывает субдомены (the source - всего 41 строка).

1

У меня была схожая ситуация, хотя у меня был сайт example.com.com, где пользователь мог войти в систему и управлять своим сайтом, а затем OrgA.example.com был публичным сайтом, который будет обновляться на основе зарегистрированных пользователей. действия на example.com.

В результате я создал два отдельных приложения и установил виртуальные хосты в пределах соединения с пунктом example.com в одно приложение и «*» на другое. Here's an example о том, как это сделать.

7

, если вы не хотите использовать express.vhost, вы можете использовать HTTP-прокси для достижения более организованной системы маршрутизации/порт

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)