如何使用Node和Express来实现客户/客户端风格的子域名

如何让客户使用其域名中的组织名称访问SaaS?

例如,Web应用程序example.com可能有2个客户,OrgA和OrbB。

login后,每个客户都会被redirect到他们的网站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 (eg load specific org preferences) res.render "app/index", { layout: "app/app" } 

NB。 域数组中的第一项是组织名称。 我假设没有端口出现在主机头,现在,我不考虑如何处理非组织的子域名(如www,博客等)。

因此,我的问题更多的是如何configurationnode / express来处理具有不同主机头的请求。 这通常在使用通配符别名的Apache中或在使用主机头的IIS中解决。

一个Apache / Rails的例子是@ http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails

节点中怎样才能实现呢?

如果您不想使用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) 

我认为任何到达您的节点服务器的IP地址和端口的请求都应该由您的节点服务器来处理。 这就是为什么你在阿帕奇的虚拟主机,区分请求Apache接收通过例如子域。

看看express-subdomains的源代码,如果你想看看它如何处理子域( 源只有41行)。

我也有类似的情况,虽然我有主站点example.com用户可以login和pipe理他们的网站,然后OrgA.example.com是一个面向公众的网站,将根据login的用户的行动举例更新。 COM。

我最终创build了两个独立的应用程序,并在连接中设置虚拟主机以将“example.com”指向一个应用程序,将“*”指向另一个应用程序。 这里是一个如何做到这一点的例子 。