所以我知道这有效:
app.use(express.vhost('sub.xyz.com', subdomainApp));
app.use(express.vhost('xyz.com', mainApp));
但是当我尝试动态设置express.vhost中的主机部分时,它根本不起作用。 (我需要动态设置它,以避免在生产和开发之间移动时更改硬编码域。)
我尝试了下面的代码,我不知道为什么这不起作用:
app.use(function(req, res){ return express.vhost('xyz.'+req.host, subdomainApp); });
app.use(function(req, res){ return express.vhost(req.host, mainApp); });
那么如何将'request host'动态传递给express.vhost?
答案 0 :(得分:2)
我不确切知道您的实施细节,但我建议并且我认为这是最常见的做法,就是在环境变量中设置这些配置参数。
所以你会有。
app.use(express.vhost('xyz' + process.env.APP_HOST, subdomainApp));
因此您可以在生产/开发环境中拥有不同的环境变量。
从命令行使用
设置env变量export APP_HOST=wahtever
或在执行节点命令之前追加
APP_HOST=whatever node server.js
或将它们添加到您的* .bash_profile *或等效的操作系统
答案 1 :(得分:2)
我误解了你的问题所以我的答案是关于以编程方式绑定vhosts。我不知道你是否可以在请求进入时动态绑定新的虚拟主机,这听起来像个坏主意。我只会使用@alfonsodev的技术强制一个环境或另一个环境。
如果您要为这些域执行一组已知的子域和特定中间件,则可以将它们全部绑定到这样:
$ # set env variable before invoking the script
$ APP_DEVPROD=dev node server.js
// Default to 'prod' if no env var set
var p = process.env.APP_DEVPROD || 'prod';
var myHost = (p === 'dev' ? 'localhost:8001' : 'xyz.com');
[
['admin.'+myHost, handlers.admin],
['demo.'+myHost, handlers.demo],
].forEach(setVhost);
function setVhost(pair){
var hostname = pair[0];
var appFn = pair[1];
app.use(express.vhost(hostname, appFn));
}
答案 2 :(得分:0)
在主机名中使用*
作为通配符:
app.use(express.vhost('sub.*', subdomainApp));
app.use(mainApp);