【发布时间】:2014-01-21 03:50:26
【问题描述】:
在debian的默认apache2配置中,/etc/apache2/sites-enabled/000-default包含了很多默认VirtualHost的设置:
<VirtualHost *:80>
# Many good settings here, among them:
CustomLog ${APACHE_LOG_DIR}/access.log combined
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
</VirtualHost>
在另一个配置文件中,我想覆盖其中的一个,CustomLog 设置,以便日志转到其他位置。我不想复制或弄乱所有其他设置,例如ScriptAlias。但我仍然希望它适用于<VirtualHost *:80>。
这可能吗?
我尝试了什么
我试着把它放进去
/etc/apache2/sites-enabled/001-mylog:
<VirtualHost *:80>
CustomLog ${APACHE_LOG_DIR}/my.log combined
</VirtualHost>
这没有效果,大概是因为 apache 只查看第一个 <VirtualHost> 部分,而 /etc/apache2/sites-enabled/000-default 在 /etc/apache2/sites-enabled/001-mylog 之前加载。
相反,我尝试将相同的 sn-p 放入 /etc/apache2/conf.d/mylog,它在 /etc/apache2/sites-enabled/000-default 之前加载,因为 /etc/apache2/apache2.conf 在 Include sites-enabled/ 之前有一个 Include conf.d/。这确实会覆盖我想要的 CustomLog 值。但是现在/etc/apache2/sites-enabled/000-default的ScriptAlias不生效了。
我想避免复制 /etc/apache2/sites-enabled/000-default 中的所有内容,从而有效地创建默认 debian apache 配置文件的分支。
文档
Apache HTTP Server - core documentation 有点含糊:
当收到请求时,服务器首先将其映射到最佳匹配 仅基于本地 IP 地址和端口组合。 非通配符具有更高的优先级。如果没有发生基于 IP 和端口的匹配 完全使用“主”服务器配置。
如果多个虚拟主机包含最匹配的 IP 地址和端口,则 服务器根据请求从这些虚拟主机中选择最佳匹配 主机名。如果没有找到匹配的基于名称的虚拟主机,那么第一个 将使用与 IP 地址匹配的列出的虚拟主机。作为结果, 给定 IP 地址和端口组合的第一个列出的虚拟主机是 该 IP 和端口组合的默认虚拟主机。
<VirtualHost> 不像 <Directory>
非常令人困惑,在我看来,<VirtualHost> 指令似乎只考虑了一个匹配的实例。但是对于例如<Directory> 指令,它们被添加/组合,因此:
<Directory "/some/dir">
Options Indexes MultiViews FollowSymLinks
</Directory>
<Directory "/some/dir">
AllowOverride None
Order deny,allow
Allow from all
</Directory>
相当于:
<Directory "/some/dir">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
但是这种机制不适用于<VirtualHost> :-(
编辑:这与Sharing configuration between several VHosts 不同,因为debian 的默认VirtualHost 不使用任何这些解决方案。但也许其他人可以从这个答案中找到灵感。
【问题讨论】: