我有这个默认值000-default.conf
:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
而我创建的这个my.conf
:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
Redirect permanent / https://example.com/
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
...
</VirtualHost>
</IfModule>
如果我example.com
在浏览器上尝试,我会被重定向到https://example.com/
,这很好。
但是,如果我尝试123.45.67.89
,我也会被重定向到https://example.com/
.
由于两个虚拟服务器 (*:80) 都与 匹配123.45.67.89
,而 noServerName
与 匹配123.45.67.89
,我希望 Apache 2.4 选择000-default.conf
. 但事实并非如此。为什么?
我的参考是这样的:
如果多个虚拟主机包含最佳匹配的 IP 地址和端口,则服务器会根据请求的主机名从这些虚拟主机中选择最佳匹配。如果未找到匹配的基于名称的虚拟主机,则将使用与 IP 地址匹配的第一个列出的虚拟主机
第一个列出的主机取决于加载配置的顺序。不同的发行版有不同的文件加载机制。
在 Ubuntu 上,站点应该定义在
/etc/apache2/sites-available
. 这些是通过在 中创建链接来启用的/etc/apache2/sites-enabled
。启用的站点从该目录按规范顺序加载。sites-available
未链接到的文件sites-enabled
不会被加载。配置从加载文件,
/etc/apache2/mods-enabled
并etc/apache2/conf-enabled
在加载站点之前从sites-enabled
.如果启用 info 模块,您应该能够通过导航到
https://www.example.com/server-info
. 检查此页面上虚拟主机的顺序。也可以将重定向放置
.htaccess
在文档目录中的文件中。也可以将重定向指令放置在容器以外的Virtualhost
容器中。您可能希望通过转储服务器标头来验证正在发生哪些重定向。我使用类似的命令
wget -qSO /dev/null http://192.0.2.22
。这将显示每个重定向的标头。您的默认基于名称的虚拟主机缺少
ServerName
.可能是派生的 FQDN 与第二个虚拟主机中的主机名匹配,导致Virtual Host Matching出现不直观的问题。
在有关DNS 和 Apache HTTP 服务器的问题中也建议和解释了相同的内容:
添加一些东西到
ServerName
. 任何事物。除非有另一个匹配项,否则您的第一个<VirtualHost>
仍将是默认设置。它甚至可以是 IP 地址。只是不要让它未指定。使用例如ServerName 198.51.100.10
(使用您的服务器的 IP)或ServerName default-catch-all.example.org