apache2 忽略默认主机并始终重定向到域,即使在使用 IP 时也是如此
apache2 ignoring the default host and always redirecting to domain, even when using the IP
我试图让 apache2 在用户通过 IP 地址访问我的服务器时使用默认站点,而不是输入站点的域,只是告诉用户他不能直接访问该 ip。
发生的事情是它不断重定向到域的站点,覆盖浏览器中的 IP 地址,而不是显示默认站点。
请注意,域的站点已重定向到 https,这是预期的。
默认站点根本不使用 ssl,最好不要使用 ssl。
我的站点配置如下(没有日志记录、错误文档或 ssl 路径指令):
000-default.conf
<VirtualHost *>
DocumentRoot /var/www/html
</VirtualHost>
example.com.conf
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/example.com/www
Redirect permanent / https://example.com
</VirtualHost>
example.com-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/example.com/www
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
所有这些站点都已启用并且 apache2 已重新启动。
> $ sudo apache2ctl -S
VirtualHost configuration:
*:* 1.2.3.4 (/etc/apache2/sites-enabled/000-default.conf:1)
*:443 example.com (/etc/apache2/sites-enabled/example.com-ssl.conf:2)
*:80 example.com (/etc/apache2/sites-enabled/example.com.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
http://example.com
和 https://example.com
的行为符合预期。
http://1.2.3.4:80/
意外重定向到 https://example.com
。
您应该避免 <virtualhost *>
,这相当于 <virtualhost *:*>
,这确实很不寻常。从任何虚拟主机中省略 ServerName 也是一个坏主意,因为它将从系统主机名中提取并导致混淆。
Apache 首先选择最匹配的 IP:PORT 组合,然后从具有该最佳匹配的虚拟主机集中查看 ServerName/ServerAlias。
这就是您的 *:80
虚拟主机被选中的原因 -- 这是一个更具体的匹配项。
我试图让 apache2 在用户通过 IP 地址访问我的服务器时使用默认站点,而不是输入站点的域,只是告诉用户他不能直接访问该 ip。
发生的事情是它不断重定向到域的站点,覆盖浏览器中的 IP 地址,而不是显示默认站点。
请注意,域的站点已重定向到 https,这是预期的。 默认站点根本不使用 ssl,最好不要使用 ssl。
我的站点配置如下(没有日志记录、错误文档或 ssl 路径指令): 000-default.conf
<VirtualHost *>
DocumentRoot /var/www/html
</VirtualHost>
example.com.conf
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/example.com/www
Redirect permanent / https://example.com
</VirtualHost>
example.com-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/example.com/www
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
所有这些站点都已启用并且 apache2 已重新启动。
> $ sudo apache2ctl -S
VirtualHost configuration:
*:* 1.2.3.4 (/etc/apache2/sites-enabled/000-default.conf:1)
*:443 example.com (/etc/apache2/sites-enabled/example.com-ssl.conf:2)
*:80 example.com (/etc/apache2/sites-enabled/example.com.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex ssl-stapling: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
http://example.com
和 https://example.com
的行为符合预期。
http://1.2.3.4:80/
意外重定向到 https://example.com
。
您应该避免 <virtualhost *>
,这相当于 <virtualhost *:*>
,这确实很不寻常。从任何虚拟主机中省略 ServerName 也是一个坏主意,因为它将从系统主机名中提取并导致混淆。
Apache 首先选择最匹配的 IP:PORT 组合,然后从具有该最佳匹配的虚拟主机集中查看 ServerName/ServerAlias。
这就是您的 *:80
虚拟主机被选中的原因 -- 这是一个更具体的匹配项。