![使用 SNI 的 Apache SSL 虚拟主机忽略 ServerName](https://linux22.com/image/627740/%E4%BD%BF%E7%94%A8%20SNI%20%E7%9A%84%20Apache%20SSL%20%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E5%BF%BD%E7%95%A5%20ServerName.png)
我想为启用 SNI 的客户端发送错误的主机名 400 Bad Request,但在这种情况下 Apache 始终为默认虚拟主机提供服务。我无法添加发送 400 Bad Request 状态的默认虚拟主机,因为禁用 SNI 的客户端将始终获得此虚拟主机。
似乎服务器名称当我在启用 SNI 的 Apache 安装上启用基于名称的虚拟主机时,禁用 SNI 的客户端将忽略虚拟主机指令。
查看以下虚拟主机配置:
NameVirtualHost 192.168.4.46:443
<VirtualHost 192.168.4.46:443>
ServerName 192.168.4.46
DocumentRoot /var/www/error-page/
SSLEngine on
SSLCertificateFile /path/to/certificate.crt
SSLCertificateKeyFile /path/to/certificate.key
</VirtualHost>
<VirtualHost 192.168.4.46:443>
ServerName test-ssl
DocumentRoot /var/www/valid-website/
SSLEngine on
SSLCertificateFile /path/to/certificate.crt
SSLCertificateKeyFile /path/to/certificate.key
</VirtualHost>
如果我使用禁用 SNI 的客户端,我将收到错误页面不管的主持人:我在请求中发送的标头。因为我在两个虚拟主机中使用相同的证书,所以我希望禁用 SNI 的客户端能够根据与服务器名称。
如果我切换虚拟主机的位置,该网站将成为默认虚拟主机,然后是 SNI-已启用如果客户输入了错误的主持人:在标题中。
那么基本上,我如何让 Apache 为每个错误提供错误主持人:无论是否支持 SNI,都可以使用标头,同时在使用禁用 SNI 的客户端时仍可为网站提供服务,并提供正确的启用 SNI 的客户端时是否使用虚拟主机?
答案1
我认为最简短的答案是:
MOD_重写
设置一个条件来检查主机头;如果不正确,则将请求转发到错误页面。
您的非错误站点将是默认站点,并且重写规则将存在于此虚拟主机中。
如果确实有“更短/更简单”的选项,我怀疑这个选项将为如何处理请求提供清晰的逻辑。此解决方案假设您想要全部无论 SNI 状态如何,请求都会为给定的虚拟主机提供匹配的主机头。
答案2
删除要在错误模式下使用的虚拟主机中的 ServerName。它应该有效