覆盖默认 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
。但我仍然希望它适用于<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 不使用任何这些解决方案。但也许其他人可以从这个答案中找到灵感。
【问题讨论】:
【参考方案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 地址或端口号<VirtualHost>
标头。
这个谜题不断来来去去,因为这个话题缺乏明确的解释(在网络上)。我希望这篇文章能在某种程度上帮助缓解这个令人难以置信的问题。
【讨论】:
感谢您的回答。虽然我必须承认我不知道该怎么做——我不明白你的意思。例如。在我的示例中,我根本没有提到 ServerName。它如何回答我的问题:“在另一个配置文件中,我想覆盖其中的一个,CustomLog 设置......这可能吗?” 抱歉回复晚了,最近项目太忙了。我的意思是:以上是关于覆盖默认 Apache <VirtualHost> 块中的单个设置的主要内容,如果未能解决你的问题,请参考以下文章