虚拟主机中的通配符与dynamic日志?

我的Apache虚拟主机configuration目前有几个重复;

<VirtualHost *:80> ServerName example1.com ServerAlias www.example1.com DocumentRoot /home/example1.com/www LogLevel warn ErrorLog /home/example1.com/logs/error.log CustomLog /home/example1.com/logs/access.log combined Alias /dev /home/example1.com/dev ScriptAlias /cgi-bin/ /home/example1.com/cgi-bin </VirtualHost> 

怎么会改变,所有的'example1.com'实例被replace为用户当前正在查看的任何域?

我知道mod_vhost_alias ,但是我没有看到任何提及能够dynamic地执行日志或别名(除了ScriptAlias之外)。 有没有办法做到这一点? 我宁愿不牺牲这个单独的日志。

你可以用mod_rewrite规则解决别名问题:

 # get the server name from the Host: header UseCanonicalName Off # remove www. RewriteCond %{HTTP_HOST} ^www\.(.*)$ RewriteRule .? - [E=noWWWHost:%1] # map /dev to the documentroot for dev RewriteCond %{REQUEST_URI} !^/~ RewriteCond %{HTTP_HOST} ^www\. RewriteRule ^/dev/(.*)$ /home/${lowercase:%{ENV:noWWWHost}}/dev/$1 # not using www RewriteCond %{REQUEST_URI} !^/~ RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^/dev/(.*)$ /home/${lowercase:%{HTTP_HOST}}/dev/$1 # make a log that is "splitable" on host LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon CustomLog logs/access_log vcommon 

编辑:忘了补充说,上面的configuration是未经testing:)

有几种方法可以解决这个问题…您可以为每个主机创build一个具有相关日志文件的虚拟主机。 如果你正在寻找通配符,那么稍后用给定的主机名parsing日志可能会更容易一些。

您可以使用mod_vhost_alias并通过在行首添加%V (有效服务器名称)来更改日志格式。

然后,您只需编写一个简单的shell脚本或perl程序,它将parsing原始日志并将其写入相关日志文件。 您甚至可以使用pipe道日志实时执行此操作: CustomLog "|/path/to/script.pl" combined_vhost