我的 Apache 虚拟主机配置目前有几个重复的地方;
<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”实例都被用户当前正在查看的域所取代?
我知道mod_vhost_alias,但我没有看到任何提及它能够动态地进行日志或别名(ScriptAlias 除外)。有办法实现这一点吗?我宁愿不为此牺牲单独的日志。
答案1
您也许可以使用 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
编辑:忘记添加上面的配置未经测试:)
答案2
您可以在行首mod_vhost_alias
添加(有效服务器名称)来使用和更改日志格式。%V
然后,您只需编写一个简单的 shell 脚本或 perl 程序来解析原始日志并将其写入相关日志文件。您甚至可以使用管道日志实时执行此操作:CustomLog "|/path/to/script.pl" combined_vhost
答案3
有几种方法可以实现这一点...您可以创建一个虚拟主机,并为每个主机创建一个相关的日志文件。如果您正在寻找通配符匹配,那么稍后使用给定的主机名解析日志可能会更容易。