我有几个使用 Apache/Ubuntu 在本地主机上运行的网站。
我刚刚成功为其中一个网站安装了自签名证书,将其命名为securesite.local
。另一个非 SSL 站点,将其命名为 ,insecuresite.local
也按预期运行。
也就是说,如果我导航到
https://securesite.local
http://insecuresite.local
每个都提供正确的内容。
但是,如果我导航到http://securesite.local
它,它会提供来自insecure.local
我的 /etc/hosts 包含
127.0.1.1 securesite.local
127.0.1.1 insecuresite.local
/etc/apache2/apache2.conf 包含
IncludeOptional sites-enabled/*.conf
它不包含对 securesite 或 insecuresite 的任何明确引用。
ls /etc/apache2/sites-enabled
securesite.conf insecuresite.conf
insecuresite.conf 包含(此处缩写)
<VirtualHost insecuresite.local:80>
ServerName insecuresite.local
ServerAlias insecuresite.local
# ...
securesite.conf 包含(此处缩写)
<VirtualHost securesite.local:443>
ServerName securesite.local
ServerAlias securesite.local
# ...
我希望 Apache 拒绝通过 443 以外的任何端口与 securesite.local 的连接,而不是回退到允许该 localhost:80 上的流量的任何其他站点提供内容。
为什么会发生这种情况?我该如何阻止它?
答案1
根据您的 insecuresite.conf 和 securesite.conf 文件,一个监听端口 80,另一个监听端口 443。当您访问http://securesite.local,您的浏览器正在从端口 80 请求数据,而端口 80 上唯一提供服务的是 insecuresite.local。
要解决此问题,您需要为 securesite.local:80 定义一个虚拟主机,并将其重定向到 https。此外,您还需要确保您NameVirtualHost *
的 apache2.conf 文件中有。
您的两个 conf 文件将如下所示:
<VirtualHost *:80>
ServerName insecuresite.local
ServerAlias insecuresite.local
# ...
和
<VirtualHost *:80>
ServerName securesite.local
ServerAlias securesite.local
Redirect permanent / https://securesite.local
# ...
<VirtualHost *:443>
ServerName securesite.local
ServerAlias securesite.local
# ...
启用 NameVirtualHost 选项后,Apache 将检查 ServerNames 和 ServerAliases 并相应地提供数据。
答案2
套接字已绑定到,并且已建立连接IP 地址,而不是主机名。由于两个虚拟主机具有相同的 IP 地址,因此它们只有一个侦听套接字,并且 Apache 无法知道将请求哪个域,直到后它已经接受了连接——它必须接收 HTTP 请求(或 TLS SNI 握手)。
文件sites-enabled
按编码顺序读取,因此您可以在名为或类似名称的文件中设置“后备”虚拟主机sites-enabled/00-default.conf
。(换句话说,将其列在同一 IP 的任何其他虚拟主机之前。)