我有一台装有 Apache (httpd-2.2.15-15.el6.centos.x86_64) 的 CentOS 6 服务器。现在我使用 OpenSSL 配置了 TLS SNI,这非常简单。
现在我在同一个 IP 上有两个 TLS vhost,我想指定如果客户端不支持 TLS SNI,哪一个应该是默认的(是的,我正在看你,git/hg)。
查看 Apache 文档,至少有两种方法可以做到这一点:
- 设置为默认主机(其他所有主机设置为 *:443)
- 为非默认主机设置“SSLStrictSNIVHostCheck on”。
不幸的是,这两种方法对我来说都不起作用。有人能向我解释如何实现目标,以及为什么上述两种方法没有像我预期的那样起作用吗?
答案1
第一个启用的将是默认的,因此将默认 vhost 的配置文件重命名为类似的名称,00-config_file_name
以便它是第一个加载的。
正如您(理所当然地)希望记录某些内容:
来自 Apache 文档:虚拟主机匹配的深入讨论
基于名称的虚拟主机
如果条目对应于基于名称的虚拟主机,则名称列表包含一个或多个虚拟主机结构。此列表包含的虚拟主机的顺序与 VirtualHost 指令在配置文件中出现的顺序相同。
此列表中的第一个 vhost(配置文件中具有指定 IP 地址的第一个 vhost)具有最高优先级,并捕获对未知服务器名称的任何请求或没有 Host: 标头字段的请求。
如果客户端提供了 Host: 标头字段,则会在列表中搜索匹配的虚拟主机,并获取 ServerName 或 ServerAlias 上的第一个匹配项,然后从该虚拟主机处理请求。Host: 标头字段可以包含端口号,但 Apache 始终与客户端发送请求的实际端口进行匹配。
因此,如果您仅为 vhosts 使用 1 个配置文件,则需要在文件中对它们进行排序,如果您包含多个单独的文件(包括 ../sites-enabled 目录,这是 Apache2 示例站点的定义方式),则需要按需要首先定义默认站点的顺序加载文件,然后根据目录字母顺序加载它们。
始终根据相同的 Apache 文档(页面中的示例链接),如果您使用_default_
vhost,则必须在其他 vhost 之前定义它,这正是您将按照所需顺序定义 vhost 所做的,但是当使用_default_
vhost 时,主服务器将不再响应请求。