我在 Centos 7.4 上使用 Apache 2.4.6,并且有以下 vhosts 文件:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/example/public_html
RedirectMatch 301 ^/(.*)$ https://example.com/$1
</VirtualHost>
我想要的是一条可以应用于所有虚拟主机的规则,将它们重定向到 https(除了下面提到的需要在未加密的连接上)。
问题是我有另一个虚拟主机被重定向到 example.com,而 example.com 没有任何此类规则,也不应该被重定向。请帮我理解一下这里发生了什么?这是否意味着我必须小心其他规则,例如标头集?例如,我不想在另一个不应该有该标头的虚拟主机上设置一个适用于一个虚拟主机的 HSTS 预加载标头。
编辑:我的服务器管理不善,所以我假设我的其他域(不应该重定向的域,我们称之为 example2.com)已经设置了 vhost,但结果发现没有。我需要为 example2.com 添加一个 .conf 文件来修复此问题。它仍然无法向我解释为什么会发生这种情况,因为重定向应该被隔离到 example.com,但至少这种情况不再发生了。
答案1
来自Apache httpd 手册的基于名称的虚拟主机支持部分:
IP 和端口组合的默认基于名称的虚拟主机
如果在包含最具体匹配的 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则第一个列出的虚拟主机与之匹配的将被使用。
也就是说,通常最好先有一个中性的第一个条目,用于在某些时候收到意外请求的情况。