我正在NodeJS中构建一个SaaS应用程序并使用Express框架。网站的个人成员都有一个可以登录的自定义子域名的网址。
例如,一家名为ABC Corp的公司可以在abc.example.com
登录,另一家名为Sony的公司可以登录sony.example.com
知道如何将多个子域重定向/路由到同一个应用实例吗?
答案 0 :(得分:0)
您可以使用express-subdomain软件包。假设您有一个routes
文件夹,其中包含分别导出abc和sony子域的登录路由的abc.js
和sony.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();
}
};