在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.conf
在Include 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>
不起作用: - (
答案 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>
标头中列出的端口号。
这个难题不断出现,因为在网络上对此主题缺乏明确的解释。我希望这篇文章可以在某种程度上帮助减轻这种困扰。