为什么我的启用 SSL 的 Apache 主机的非 SSL 版本提供来自其他主机的内容?

为什么我的启用 SSL 的 Apache 主机的非 SSL 版本提供来自其他主机的内容?

我有几个使用 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 的任何其他虚拟主机之前。)

相关内容