当 ServerName 不匹配时,为什么这个 VirtualHost 定义会激活?

当 ServerName 不匹配时,为什么这个 VirtualHost 定义会激活?

我有一个 httpd24 服务器,我想用它来服务多个域。

我有 3 个 VirtualHost 定义。

<VirtualHost *:443>
   ServerName one.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/one
</VirtualHost>

<VirtualHost *:443>
   ServerName two.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/two
</VirtualHost>

<VirtualHost _default_:443>
   Redirect / https://two.example.com
</VirtualHost>

这个想法是,如果输入了确切的 URL one.example.com 或 two.example.com,他们就会得到相应的页面。如果收到任何其他域名,我希望重定向到https://two.example.com网址。

然而我发现如果我输入https://three.example.com我没有被重定向,而是提供了one.example.com 的内容。

注意https://two.example.com确实按预期工作。我的问题是,我期望重定向未知域名,但它们却被解析为 one.example.com。

我最初安装的RPM是httpd24-httpd-2.4.27-8.el6.1.x86_64。

知道发生什么事了吗?

答案1

第一个虚拟主机条目通常是默认虚拟主机将用于处理后续虚拟主机条目不匹配的请求
(简化​​; https://httpd.apache.org/docs/2.4/vhosts/details.html提供了更深入的解释...)

_default_中的字符串VirtualHost条目,只是 的别名*,实际上,当它不是第一个定义时,它通常不会真正将特定的 VirtualHost 条目设为默认 VirtualHost……

更改虚拟主机定义的顺序,您的问题就应该得到解决。

<VirtualHost _default_:443>
   Redirect / https://two.example.com
   # ServerName not needed
   # Any vhost that includes the magic _default_ wildcard is given the same ServerName as the main server. 
   # SSL stuff
</VirtualHost>

<VirtualHost *:443>
   ServerName one.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/one
</VirtualHost>

<VirtualHost *:443>
   ServerName two.example.com
   # SSL stuff
   DocumentRoot "/opt/rh/httpd24/root/var/www/two
</VirtualHost>

相关内容