Apache通过HTTP Host头匹配VirtualHost实现单IP多域名托管,需启用名称虚拟主机、按配置顺序匹配默认站点,并在Directory中显式授权访问权限。
apache 通过 virtualhost 实现单 ip 托管多域名,本质是靠 http 协议层面的 host 请求头识别,而非网络层的 ip 或端口区分。
HTTP Host 头是关键判断依据
当用户访问 www.site1.com 时,浏览器发出的 HTTP 请求中必然包含:
Apache 在接收到请求后,不看目标 IP(因为所有域名都解析到同一个服务器 IP),而是提取这个 Host 字段值,再逐个比对已加载的 <VirtualHost *:80> 块中的 ServerName 和 ServerAlias 指令。匹配成功即启用对应配置——包括 DocumentRoot、日志路径、目录权限等。
必须启用基于名称的虚拟主机机制
Apache 默认不会主动按 Host 头路由,需显式启用该行为:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 旧版本(Apache 2.2 及以前)需手动添加
NameVirtualHost *:80指令,且必须与<VirtualHost *:80>的监听格式严格一致(如不能混用*:80和192.168.1.100:80) - Apache 2.4+ 已自动启用,只要存在两个及以上
<VirtualHost *:80>块,就默认按 Host 头匹配;但NameVirtualHost指令已被废弃,不可再写
匹配顺序与默认站点逻辑
Apache 按配置文件中 <VirtualHost> 出现的**先后顺序**进行匹配:
- 第一个定义的
<VirtualHost *:80>会成为“默认虚拟主机” - 当请求的 Host 值无法匹配任何
ServerName或ServerAlias时(例如直接用 IP 访问,或输错域名),Apache 就回落到这个第一个块处理 - 因此,建议把最通用的站点(如主站)放在最前面,避免意外命中错误目录
Directory 权限必须显式放行
仅定义 DocumentRoot 不足以让网站可访问。从 Apache 2.4 起,目录默认拒绝所有请求。必须在 <VirtualHost> 内嵌套 <Directory> 块并明确授权:
Require all granted
</Directory>
缺少这一步,即使域名匹配成功,也会返回 403 Forbidden 错误。

















