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

Posted

技术标签:

【中文标题】覆盖默认 Apache <VirtualHost> 块中的单个设置【英文标题】:Override single setting in default Apache <VirtualHost> block 【发布时间】: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。但我仍然希望它适用于&lt;VirtualHost *:80&gt;

这可能吗?

我尝试了什么

我试着把它放进去 /etc/apache2/sites-enabled/001-mylog:

<VirtualHost *:80>
    CustomLog $APACHE_LOG_DIR/my.log combined
</VirtualHost>

这没有效果,大概是因为 apache 只查看第一个 &lt;VirtualHost&gt; 部分,而 /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.confInclude sites-enabled/ 之前有一个 Include conf.d/。这确实会覆盖我想要的 CustomLog 值。但是现在/etc/apache2/sites-enabled/000-defaultScriptAlias不生效了。

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

文档

Apache HTTP Server - core documentation 有点含糊:

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

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

&lt;VirtualHost&gt; 不像 &lt;Directory&gt;

非常令人困惑,在我看来,&lt;VirtualHost&gt; 指令似乎只考虑了一个匹配的实例。但是对于例如&lt;Directory&gt; 指令,它们被添加/组合,因此:

<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>

但是这种机制不适用于&lt;VirtualHost&gt; :-(

编辑:这与Sharing configuration between several VHosts 不同,因为debian 的默认VirtualHost 不使用任何这些解决方案。但也许其他人可以从这个答案中找到灵感。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

感谢您的回答。虽然我必须承认我不知道该怎么做——我不明白你的意思。例如。在我的示例中,我根本没有提到 ServerName。它如何回答我的问题:“在另一个配置文件中,我想覆盖其中的一个,CustomLog 设置......这可能吗?” 抱歉回复晚了,最近项目太忙了。我的意思是: Header 不能单独工作,它与里面的 ServerName 值一起工作。因此,要区分不同的虚拟主机定义,必须同时检查它们。这就是为什么虚拟主机定义的行为不同于目录的原因。

以上是关于覆盖默认 Apache <VirtualHost> 块中的单个设置的主要内容,如果未能解决你的问题,请参考以下文章

Apache:客户端被服务器配置拒绝

Apache:客户端被服务器配置拒绝

本地主机上的 Apache 虚拟主机

配置虚拟主机

如何覆盖 Apache 的摘要身份验证

覆盖函数的默认参数[重复]