瓦迪姆是几乎是正确的想法 https://stackoverflow.com/questions/11960705/expressjs-server-how-to-handle-multiple-domains#comment15940267_11960962。您可以配置如何响应每个域vhost中间件 http://www.senchalabs.org/connect/vhost.html:
// `baz.com`
var app = express.createServer();
app.get( '/', routes.index );
// ...
express.createServer()
.use( express.vhost( 'foo.com', express.static( '/var/www/foo' ) ) )
.use( express.vhost( 'bar.net', express.static( '/var/www/bar' ) ) )
.use( express.vhost( 'baz.com', app ) )
.use( function( req, res ) {
res.send('Sorry, I do not know how to handle that domain.');
})
.listen( ... );
routes.index
然后可以简化为仅处理baz.com
要求:
exports.index = function( req, res ) {
// ... lines ...
res.render( 'index', { title: 'Baz Title example' } );
};
Edit
至于比较:
The switch
将首先有效地完成,并将根据host
- 如同:
express.createServer().use(function( req, res, next ) {
switch( req.host ) {
case 'foo.com': express.static( '/var/www/foo' )( req, res, next ); break;
case 'bar.net': express.static( '/var/www/bar' )( req, res, next ); break;
case 'baz.com': app.handle( req, res, next ); break;
default: res.send( ... );
}
}).listen( ... );
它允许您在启动时设置堆栈,以便任何中间件立即可用:
server.stack = [
express.vhost( 'foo.com', ... ),
express.vhost( 'bar.net', ... ),
express.vhost( 'baz.com', ... ),
[Function]
];
这些也反映了您可能遇到的问题的两个可能来源:
没有过滤器的相同堆栈
Each Application
只有 1 个中间件堆栈,您正在使用的所有中间件都直接添加到其中app.use(...)
。尽管添加了一些条件,您仍然会得到:
app.stack = [
// ...,
app.router,
express.static( '/var/www/foo' ),
express.static( '/var/www/bar' )
];
并且条件不会改变static
中间件响应——这是通过req.path
, not req.host
-- 仅当它们位于堆栈中时才开始响应。
堆栈的状态
并且,如果static
直到添加中间件after已提出另一个请求,然后我认为它们无法立即可用:
// GET http://foo.com/file 404
app.stack = [ app.router ]
// GET http://foo.com/ 200
app.stack = [ app.router, express.static( '/var/www/foo' ) ]
// GET http://foo.com/file 200
app.stack = [ app.router, express.static( '/var/www/foo' ) ]
这也可能意味着同样的static
中间件可以多次添加到堆栈中:
// 3x GET http://foo.com/
app.stack = [
app.router,
express.static( '/var/www/foo' ),
express.static( '/var/www/foo' ),
express.static( '/var/www/foo' )
]
并且让它们的添加取决于其他请求也暗示了可能的竞争条件:
// was `foo.com` or `bar.net` first?
app.stack = [
app.router,
express.static( ? ),
express.static( ? )
]