Подтвердить что ты не робот

Как сделать субдомены стиля клиента/клиента с помощью Node и Express

Как разрешить клиентам доступ к SaaS с использованием имени своей организации в домене?

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

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

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

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 с использованием заголовка узла.

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

Как это можно сделать в node?

4b9b3361

Ответ 1

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

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)

Ответ 2

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

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

Ответ 3

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

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