Apache 上的自动通配符子域名

Apache 上的自动通配符子域名

目前,我为各个子域设置了多个虚拟主机。如果我可以告诉 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了解众多海量虚拟主机技巧。

相关内容