覆盖默认Apache <virtualhost>块</virtualhost>中的单个设置

时间:2014-01-03 13:01:22

标签: apache vhosts

在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之前加载。

相反,我尝试将相同的代码段放在/etc/apache2/conf.d/mylog中,在/etc/apache2/sites-enabled/000-default之前加载,因为/etc/apache2/apache2.confInclude conf.d/之前有Include sites-enabled/。这确实会覆盖我想要的CustomLog值。但是现在来自ScriptAlias的{​​{1}}没有生效。

我想避免重复/etc/apache2/sites-enabled/000-default有效创建默认debian apache配置文件的分支的所有内容。

文档

Apache HTTP Server - core documentation这个含糊不清:

  

收到请求后,服务器首先将其映射到最佳匹配    仅基于本地IP地址和端口组合。   非通配符具有更高的优先级。如果没有基于IP和端口的匹配发生   根本就是使用“主”服务器配置。

     

如果多个虚拟主机包含最匹配的IP地址和端口,则   服务器根据请求从这些虚拟主机中选择最佳匹配   主机名。如果找不到匹配的基于名称的虚拟主机,那么第一个   将使用列出的与IP地址匹配的虚拟主机。作为结果,   第一个列出的给定IP地址和端口组合的虚拟主机是   该IP和端口组合的默认虚拟主机。

/etc/apache2/sites-enabled/000-default的行为与<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> 不起作用: - (

1 个答案:

答案 0 :(得分:0)

我对多个虚拟主机(虚拟主机)的定义感到困惑。它们是否覆盖(重新定义),重叠?还是里面还有其他隐蔽的细节?

我找到了这个难题的一些链接,如下所示:
https://www.thegeekstuff.com/2011/07/apache-virtual-host/
https://httpd.apache.org/docs/2.4/vhosts/examples.html

请注意其中的这些示例,我可以说虚拟主机的定义不相同(即使它们看起来相同)。区别主要在于 SeverName 内部定义。 Apache httpd服务器根据内部的 ServerName (每个vhost定义)不是 IP地址来区分不同的vhost定义或<VirtualHost>标头中列出的端口号。

这个难题不断出现,因为在网络上对此主题缺乏明确的解释。我希望这篇文章可以在某种程度上帮助减轻这种困扰。