我有一个 Apache 2.4 服务器,其中启用了两个虚拟主机:
/etc/apache2/sites-enabled/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>
/etc/apache2/sites-enabled/my-website.conf
<VirtualHost my-website.com:80>
ServerAdmin [email protected]
ServerName my-website.com
Redirect permanent "/" "https://my-website.com/"
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost my-website.com:443>
....
</VirtualHost>
</IfModule>
我创建了一个指向同一台机器的域名:my-other-website.com。
当我在 my-other-website.com 上发出 http 请求(浏览器、curl 等)时,我期望它能为默认虚拟主机提供服务。但实际上,我得到了 301 重定向到https://my-website.com/
。
怎么会?
改變<VirtualHost *:80>
並<VirtualHost _default_:80>
沒有幫助。
答案1
VirtualHost 的行进有点奇特且特别。
“问题”在于您将 a*:80
与之混合hostname:80
,当收到针对该 IP 地址和端口号组合的请求时,后者是首选匹配。
并且 *:80 仅仅是针对那些与 my-website.com 域名不具有相同 IP 地址的请求的默认 VirtualHost。
看https://httpd.apache.org/docs/2.4/vhosts/details.html#hostmatching
当某个地址和端口上首次接收到连接时,服务器会查找所有具有相同 IP 地址和端口的 VirtualHost 定义。
如果地址和端口没有完全匹配,则考虑通配符 (*) 匹配。
如果没有找到匹配项,则主服务器将处理该请求。
如果有 IP 地址的 VirtualHost 定义,下一步就是决定我们是否必须处理基于 IP 还是基于名称的虚拟主机。
答案2
将两个虚拟主机设为
<VirtualHost *:80>
但是我会为两个主机使用同一个 IP,可以是同一个 IP <VirtualHost xx.xx.xx.xx:80>