我的网站有一个启用 SSL 的虚拟主机,网址为example.com:10443
Listen 10443
<VirtualHost _default_:10443>
ServerName example.com:10443
ServerAdmin [email protected]
ErrorLog "/var/log/httpd/error_log"
TransferLog "/var/log/httpd/access_log"
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile "/etc/ssl/private/example.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
SSLCertificateChainFile "/etc/ssl/private/sub.class1.server.ca.pem"
SSLCACertificateFile "/etc/ssl/private/StartCom.pem"
</VirtualHost>
浏览至https://example.com:10443/可以正常工作。但是,浏览到https://subdomain.example.com:10443/(设置了 DNS) 显示相同的页面(在 SSL 证书警告之后)。我原本希望该指令ServerName example.com:10443
会拒绝所有与其他服务器名称的连接尝试。
我如何告诉虚拟主机不要为除顶级 URL 之外的 URL 提供请求?
答案1
您尚未启用NameVirtualHost
,因此_default_
会将任何与您的服务器的连接发送到配置。请尝试这样做。我添加了空格以提高可读性
NameVirtualHost *:10443
Listen 10443
<VirtualHost *:10443>
ServerName example.com:10443
ServerAlias example.com:10443
ServerAdmin [email protected]
ErrorLog "/var/log/httpd/error_log"
TransferLog "/var/log/httpd/access_log"
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile "/etc/ssl/private/example.com.crt"
SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
SSLCertificateChainFile "/etc/ssl/private/sub.class1.server.ca.pem"
SSLCACertificateFile "/etc/ssl/private/StartCom.pem"
</VirtualHost>
答案2
您似乎没有使用该NameVirtualHost
选项,因此 Apache 不会费心检查客户端发送的请求中的服务器主机名。请求将被定向到第一VirtualHost
部分,其中 IP:port 匹配,仅此而已。无论您使用什么主机名,都没关系,您将获得完全相同的网站。这称为基于 IP 的虚拟主机匹配。
查看http://httpd.apache.org/docs/2.2/vhosts/details.html了解虚拟主机匹配的完整语义,包括使用的结果NameVirtualHost
。
答案3
当只有连接级别详细信息可用时,Apache 总是在第一次传递中找到最佳的 ip:port,然后在第二次传递中从剩余的内容中查看主机名(如果在 2.2 中,则必须存在 NameVirtualHost 指令才能允许第二步)
默认与 * 相同。如果某个端口只有一个虚拟主机,则无论是否存在基于名称的 vhost 匹配,都会使用该虚拟主机。
如果您想要一个 * 或特定 IP 的捕获器,请将其创建为一组匹配的 ip:port 组合中的第一个虚拟主机。您可以从那里拒绝任何内容。