2

所以我知道这有效:

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); });

那么我如何动态地将“请求主机”传递给 express.vhost?

4

3 回答 3

2

我不确切知道您的实现细节,但我建议并且我认为这是最常见的做法是在环境变量中设置这些配置参数。

所以你会的。
app.use(express.vhost('xyz' + process.env.APP_HOST, subdomainApp));

因此您可以在生产/开发环境中拥有不同的环境变量。

从命令行使用设置环境变量

export APP_HOST=wahtever  

或在执行节点命令之前追加

APP_HOST=whatever node server.js

或将它们添加到您的 *.bash_profile* 或您的操作系统的等效项

于 2013-10-22T10:51:44.020 回答
2

我误读了您的问题,所以我的回答是关于以编程方式绑定虚拟主机。我不知道您是否可以在请求进入时即时绑定新的虚拟主机,这听起来是个坏主意。我只会使用@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));
}
于 2013-10-22T14:53:05.407 回答
0

*主机名中用作通配符:

app.use(express.vhost('sub.*', subdomainApp));
app.use(mainApp);

请参阅http://www.senchalabs.org/connect/vhost.html

于 2013-10-23T04:36:53.647 回答