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

Pet*_*rch 7 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>
Run Code Online (Sandbox Code Playgroud)

在另一个配置文件中,我想覆盖它们中的一个,即CustomLog设置,以便日志转到其他地方.我不想复制或搞乱所有其他设置,例如ScriptAlias.但我仍然希望它适用于<VirtualHost *:80>.

那可能吗?

我尝试了什么

我试过这个 /etc/apache2/sites-enabled/001-mylog:

<VirtualHost *:80>
    CustomLog ${APACHE_LOG_DIR}/my.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这没有任何影响,大概是因为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.conf有一个Include conf.d/之前Include sites-enabled/.这确实覆盖了CustomLog我想要的价值.但是现在这个ScriptAlias从未/etc/apache2/sites-enabled/000-default生效.

我想避免重复一切,从/etc/apache2/sites-enabled/000-default有效创建默认debian apache配置文件的fork.

文档

Apache HTTP Server - 核心文档相当模糊:

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

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

<VirtualHost> 表现得不像 <Directory>

非常混乱,它看起来好像对于<VirtualHost>指令,只考虑一个匹配的实例.但是对于eg <Directory>指令,它们被添加/组合,因此:

<Directory "/some/dir">
        Options Indexes MultiViews FollowSymLinks
</Directory>
<Directory "/some/dir">
        AllowOverride None
        Order deny,allow
        Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)

相当于:

<Directory "/some/dir">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)

但这种机制不适用于<VirtualHost>:-(

Stn*_*ish 0

我对多个虚拟主机(虚拟主机)定义也有同样的困惑。它们是否覆盖(重新定义)、重叠?还是里面还有其他不可告人的细节?

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

考虑到里面的这些例子,我可以说虚拟主机的定义是不一样的(即使它们看起来是一样的)。区别主要在于定义里面的SeverName。Apache httpd 服务器根据内部的ServerName(每个虚拟主机定义)来区分不同的虚拟主机定义,而不是标头中列出的 IP 地址或端口号。<VirtualHost>

这个谜题不断出现,因为缺乏对该主题的明确解释(在网络中)。我希望这篇文章能在某种程度上帮助缓解这个令人难以置信的问题。