目前,我为各个子域设置了多个虚拟主机。如果我可以告诉 Apache 使用通配符自动查找文件夹,那就容易多了。例如,hello.domain.com
将/var/www/hello
目录用作其DocumentRoot
。
但是我希望能够定义异常,比如如果我想helloworld.domain.com
指向/var/www/helloworld/public
。
我环顾四周,但所有的例子似乎都在做一些不同的事情。
答案1
您将能够按照如下方式配置该行为:
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>
答案2
上述用途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 方法的另一个优点是它可以处理任何域,不一定是子域 - 但在测试(httpd-2.2.x)时,似乎可以ServerAlias
接受任何合理的 * 和 ? 通配符,包括 *.com 甚至 *。所以,如果您不需要复杂性,那就没有胜利。
%v
无论哪种情况,使用 LogFormat/CustomLog 指令将请求的虚拟主机名 ( ) 放入日志中都会很有用:
LogFormat "%v %h %l %u %t \"%r\" %>s %b" log-with-vhost
也可以看看http://httpd.apache.org/docs/2.2/vhosts/mass.html了解众多海量虚拟主机技巧。