我有多个 SSL 虚拟主机和非 SSL 虚拟主机,它们由一台服务器提供服务。如果使用“https”访问其中一个非 SSL 虚拟主机,则使用第一个 SSL 指令。是否有一些设置可以确保只有具有明确匹配的服务器名称的虚拟主机才可使用?
假设我有www.a.com
、www.b.com
和www.c.com
。
假设我也有https://www.a.com
和https://www.b.com
。
如果我访问https://www.c.com
,则与使用网站 相同https://www.a.com
。这是不受欢迎的行为。我可以设置什么来让不使用任何网站吗?
答案1
我不这么认为,因为 Apache 只会读取它看到的第一个 443 端口并将其呈现给用户。
您可以提供一个空白目录,其中包含一个 .htaccess 页面,该页面可以捕获传入的内容并重定向到 http 版本。您可以使用以下命令执行此操作:
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
不要忘记将 .htaccess 目录的 httpd.conf 配置放在开头,即第一个 443 个条目之前。
答案2
您必须有一个用于 SSL 连接的默认虚拟主机。但它不必包含任何内容,因此您可以为此目的创建一个新的虚拟主机并使用自签名证书。
必须将默认 vhost 配置为支持足够新的 SSL 版本,以便从客户端接收 SNI [来源:Apache 维基] 它可能配置有SSLStrictSNIVHostCheck禁止没有 SNI 支持的客户端。
据我从这些链接中了解,支持 SNI 但报告没有明确匹配的虚拟主机的域名的客户端将始终位于默认虚拟主机上,这就是为什么您可能想要一个没有内容的虚拟主机。
对于没有 HTTPS 的域名,这两种方法都不太好,因为它不会提供良好的用户体验。相反,我建议您在所有域名上都支持 HTTPS(可以免费获得证书),或者对支持和不支持 HTTPS 的域名使用不同的 IP 地址。
答案3
对于不使用 SSL 的虚拟主机,请使用一个 IP 地址;对于使用 SSL 的虚拟主机,请使用另一个 IP 地址。请确保SSL 的Listen
和VirtualHost
指令明确指定该 IP 地址,而不是例如*:443
。