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

Override single setting in default Apache <VirtualHost> block

提问人:Peter V. Mørch 提问时间:1/3/2014 最后编辑:Peter V. Mørch 更新时间:2/12/2020 访问量:4381

问:

在 debian 默认的 apache2 配置中,包含了很多默认 VirtualHost 的设置:/etc/apache2/sites-enabled/000-default

<VirtualHost *:80>
    # Many good settings here, among them:
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
</VirtualHost>

在另一个配置文件中,我想覆盖其中的一个设置,以便日志转到其他地方。我不想复制或弄乱所有其他设置,例如.但我仍然希望它适用于.CustomLogScriptAlias<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

相反,我尝试将相同的片段放入 ,该片段之前加载,因为之前有一个 .这确实覆盖了我想要的值。但现在 from 不生效。/etc/apache2/conf.d/mylog/etc/apache2/sites-enabled/000-default/etc/apache2/apache2.confInclude conf.d/Include sites-enabled/CustomLogScriptAlias/etc/apache2/sites-enabled/000-default

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

文档

Apache HTTP Server - 核心文档有这个相当模糊的地方:

收到请求后,服务器首先将其映射到最佳匹配项 仅基于本地 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>

编辑:这与在多个 VHost 之间共享配置不同,因为 debian 的默认 VirtualHost 不使用任何这些解决方案。但也许其他人可以从这个答案中找到灵感。

Apache 虚拟主机

评论


答:

0赞 StndFish 2/12/2020 #1

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

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

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

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

评论

0赞 Peter V. Mørch 2/16/2020
谢谢你的回答。虽然我必须承认我不知道该怎么做——我不明白你的意思。例如,我在示例中根本没有提到 ServerName。它如何回答我的问题:“在另一个配置文件中,我想覆盖其中的一个,即 CustomLog 设置......这可能吗?
0赞 StndFish 2/25/2020
对不起,回复晚了,最近我的项目太忙了。我的意思是:<虚拟主机>标头不能单独工作,它与内部的 ServerName 值一起工作。因此,要区分不同的虚拟主机定义,必须同时检查它们。这就是虚拟主机定义的行为与目录定义不同的原因。