如何将多个子域重定向到同一个运行的快速应用程序

时间:2013-08-21 07:07:24

标签: node.js express subdomain saas

我正在NodeJS中构建一个SaaS应用程序并使用Express框架。网站的个人成员都有一个可以登录的自定义子域名的网址。

例如,一家名为ABC Corp的公司可以在abc.example.com登录,另一家名为Sony的公司可以登录sony.example.com

知道如何将多个子域重定向/路由到同一个应用实例吗?

2 个答案:

答案 0 :(得分:0)

您可以使用express-subdomain软件包。假设您有一个routes文件夹,其中包含分别导出abc和sony子域的登录路由的abc.jssony.js文件,则可以在index.js或任何文件中包含以下文件您的Express服务器正在从中监听。

const subdomain = require('express-subdomain');
const express = require('express');
const app = express();
const abcRoutes = require('./routes/abc');
const sonyRoutes = require('./routes/sony');
const port = process.env.PORT || 3000;

// use the subdomain middleware
app.use(subdomain('abc', abcRoutes));
app.use(subdomain('sony', sonyRoutes));

// a simple get route on the top-level domain
app.get('/', (req, res) => {
  res.send('Welcome to the Home Page!');
});

// add any other needed routes

module.exports = app.listen(port, () => {
  console.log('Server listening on port ' + port);
});

您的服务器将按预期运行并正常运行
http://example.com/->欢迎使用主页!
http://abc.example.com/login->(您的abc登录页面)
http://sony.example.com/login->(您的Sony登录页面)

要在本地测试子域,您需要将其添加到/etc/hosts文件中。 (需要sudo权限)

127.0.0.1      localhost
127.0.0.1      example.com
127.0.0.1      abc.example.com
127.0.0.1      sony.example.com

在Windows上,/etc/hosts文件的等效项为%systemroot%\system32\drivers\etc

有关在本地check here上设置本地主机域的详细信息

您可以使用子域包做更多的事情。它接受通配符,如果需要此功能,可以使用它来检查API密钥。

https://npmjs.com/package/express-subdomain处查看express-subdomain软件包的文档

答案 1 :(得分:-2)

您实际上可以处理该特定路线或广泛范围,然后转到您要重定向的Reg Exp(允许您执行此操作app.get(new RegExp('(your|string)\/here'), function…),然后按照下面的代码执行重定向操作正在做:

response.writeHead(302, {
  'Location': 'yourpath/page.html'
  //add other headers here...
});
response.end();

<小时/> 更新1 :[根据评论和其他更新]

然后,您尝试使用以下应用处理所有请求:

express()
.use(express.vhost('abc.example.com', require('/path/to/loginApp').app))
.use(express.vhost('sony.example.com', require('/path/to/loginApp').app))
.listen(80)

其中/path/to/loginApp可以是绝对路径或相对路径。

我希望这能解决你的问题。

更新2

实际上,当请求进入时,会在HTTP Server上引发请求事件。所以基本上它是由express处理的,express.vhost是一个中间件函数,它在HTTP Server的另一个实例上引发请求事件,就是它的工作原理。

以下是代码:

function vhost(req, res, next){
    if (!req.headers.host) return next();
    var host = req.headers.host.split(':')[0];
    if (req.subdomains = regexp.exec(host)) {
      req.subdomains = req.subdomains[0].split('.').slice(0, -1);
      server.emit('request', req, res);
    } else {
      next();
    }
  };