Apache上的自动通配符子域

目前我有几个虚拟主机为个别子域设置。 如果我能告诉Apache使用通配符自动查找文件夹,那将会容易得多。 例如, hello.domain.com将使用/var/www/hello目录作为其DocumentRoot

然而,我希望能够定义exception,例如,如果我想让helloworld.domain.com指向/var/www/helloworld/public

我环顾四周,但所有的例子似乎在做一些不同的事情。

你可以用这些行来configuration这个行为:

 NameVirtualHost *:80 <VirtualHost *:80> ServerName catchall.domain.com ServerAlias *.domain.com VirtualDocumentRoot /var/www/%1 </VirtualHost> <VirtualHost *:80> ServerName helloworld.domain.com DocumentRoot /var/www/helloworld/public </VirtualHost> 

上面使用mod_vhost_alias ,我使用mod_rewrite ,在第一个定义的(默认的)VirtualHost中是这样的:

 RewriteEngine on RewriteMap lc int:tolower RewriteCond /var/www/${lc:%{SERVER_NAME}} -f RewriteRule ^/(.*) /var/www/${lc:%{SERVER_NAME}}/htdocs/$1 

这可以让你添加更多的逻辑,如果它是有用的。 我曾经想过,mod_rewrite方法的另一个优点是它可以处理任何域,不一定是子域 – 但是在testing(httpd-2.2.x)上,似乎ServerAlias会接受任何合理的*和? 通配符,包括* .com甚至*。 所以,如果你不需要复杂的话就不会赢。

在任何一种情况下,使用LogFormat / CustomLog指令将请求的虚拟主机名称( %v )放入日志中可能很有用:

 LogFormat "%v %h %l %u %t \"%r\" %>s %b" log-with-vhost 

另请参阅http://httpd.apache.org/docs/2.2/vhosts/mass.html了解许多大容量虚拟主机技巧&#x3002;