apache中sni与泛域名可共存:sni在tls握手阶段识别子域并加载通配符证书,mod_vhost_alias在http层通过virtualdocumentroot动态路由;需配置serveralias *.example.com、通配符ssl证书及dns泛解析,且显式虚拟主机须置于泛域名块之前。
apache 中 sni 与泛域名可以共存,但不是“把泛域名写进 servername”,而是靠 分层策略 + 模块协同 + 证书匹配 实现:sni 负责在 tls 握手阶段识别具体子域(如 a.example.com),泛域名逻辑则由 mod_vhost_alias 在 http 层动态路由。二者分工明确,互不冲突。
核心前提:SNI 必须先生效
泛域名配置依赖请求能抵达 Apache,而 HTTPS 请求抵达的前提是 TLS 握手成功——这必须靠 SNI 支持:
- 客户端在 ClientHello 明文阶段发送子域名(如 api.example.com),Apache 通过 mod_ssl + OpenSSL 回调捕获该名
- Apache 查找
<virtualhost></virtualhost>中匹配ServerName或ServerAlias *.example.com的块 - 若匹配成功,加载对应通配符证书(
*.example.com)完成握手;若未启用 SNI 或无匹配块,则 fallback 到第一个 SSL 虚拟主机,导致证书错误
泛域名虚拟主机配置(HTTP + HTTPS 双支持)
关键点:HTTPS 泛域名必须用通配符证书,且 ServerName 仍设为主域名,ServerAlias 才写 *.example.com:
<virtualhost>
ServerName example.com
ServerAlias *.example.com
UseCanonicalName Off
VirtualDocumentRoot /var/www/subdomains/%1
</virtualhost><p><virtualhost>:443>
ServerName example.com
ServerAlias .example.com
UseCanonicalName Off
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example_com_wildcard.crt
SSLCertificateKeyFile /etc/ssl/private/example_com_wildcard.key
SSLCertificateChainFile /etc/ssl/certs/example_com_chain.pem
VirtualDocumentRoot /var/www/subdomains/%1
</virtualhost></p>
说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
%1解析 Host 头中第一个点前部分(a →/var/www/subdomains/a/) - 通配符证书必须由权威 CA 签发(如 Let’s Encrypt 的
*.example.com),单域名证书或自签证书无法覆盖子域 - DNS 需配置泛解析:
* IN A 203.0.113.5,确保所有子域流量到达服务器
多级子域或特殊子域需显式隔离
泛域名适合常规子域(blog、shop、dev),但敏感或结构特殊的子域建议单独定义虚拟主机,避免权限混同或路径冲突:
- 例如
admin.example.com应用独立<virtualhost></virtualhost>,绑定专用证书和更严访问控制 - 例如
api.v2.example.com若需走 API 网关,可用VirtualDocumentRoot /var/www/api/%-2+%提取倒数第二段(v2)作目录名 - 所有显式虚拟主机必须放在泛域名块之前(Apache 加载顺序优先),否则会被泛匹配提前截获
验证是否真正共存生效
不要只测浏览器访问,要用底层工具确认各环节:
- 查 SNI 是否被识别:
openssl s_client -connect example.com:443 -servername a.example.com -showcerts 2>/dev/null | grep "CN="→ 应显示CN=*.example.com - 查路由是否正确:
curl -H "Host: test.example.com" http://127.0.0.1→ 返回/var/www/subdomains/test/下内容 - 查证书覆盖范围:
openssl x509 -in /etc/ssl/certs/example_com_wildcard.crt -text -noout 2>/dev/null | grep -A1 "Subject Alternative Name"→ 应含DNS:*.example.com










