apache将第一个定义的视为默认虚拟主机,响应所有未匹配servername或serveralias的请求;其顺序决定默认行为,可用_default_:80精确兜底未声明ip的请求,并需确保虚拟主机机制已启用、配置语法正确。
apache 会把第一个定义的 <virtualhost></virtualhost> 当作默认虚拟主机,用来响应所有未被其他 servername 或 serveralias 明确匹配的域名请求。这个行为是确定的,不依赖额外开关,但必须确保配置逻辑正确、顺序合理、语法无误。
默认虚拟主机靠顺序决定
Apache 不看 “default” 这个词,只看配置中 <virtualhost></virtualhost> 块出现的先后顺序。第一个成功加载的、监听相同 IP 和端口的虚拟主机,就是默认主机。
- 比如你有
<virtualhost></virtualhost>定义了www.a.com,紧接着另一个<virtualhost></virtualhost>定义了www.b.com,那么访问xxx.c.com(未配置)就会落到第一个块上 - 如果想让某个特定站点当“兜底”,就把它写在所有其他
<virtualhost></virtualhost>的最前面 - 使用
httpd -S(Linux/macOS)或httpd.exe -S(Windows)可验证哪个是 default server,输出里标有 default server 的那一行就是
用 _default_:* 精确捕获未绑定的 IP+端口组合
当请求发往一个 Apache 监听了但没被任何 <virtualhost></virtualhost> 显式覆盖的 IP:port 组合时(例如服务器有多个 IP,但只配了其中某几个),可用 _default_ 指令兜底。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
<virtualhost _default_:80></virtualhost>表示:所有发往本机任意未被其他虚拟主机声明的 IP 的 80 端口请求,都交由它处理 - 更通用写法是
<virtualhost _default_:></virtualhost>,覆盖所有端口(前提是Listen已启用对应端口) - 这种写法和
*:80不同——后者仍属于“通配 IP”,而_default_是专门留给“漏网之鱼”的最后防线
常见实用兜底方案
实际部署中,常用以下方式应对未匹配请求,兼顾安全与用户体验:
-
重定向到主站:在默认虚拟主机里加
Redirect / https://www.example.com/,避免暴露目录结构或返回空白页 -
返回友好提示页:设置
DocumentRoot指向一个静态 HTML 页面(如/var/www/default),内容说明“该域名未配置” -
禁止非法 Host 头:搭配
mod_rewrite或mod_headers,对不期望的Host请求直接返回 403,防止恶意利用 - 注意:即使只做重定向,
ServerName也必须存在(哪怕填个假名如default.invalid),否则 Apache 启动会报 VirtualHost must be non-null
别忘了基础前提
默认虚拟主机能生效,前提是整个虚拟主机机制已启用:
- 确认
mod_vhost_alias或至少mod_alias已加载(现代 Apache 通常默认启用) - 确保主配置中已包含
Include指令引入虚拟主机文件(如Include conf/extra/httpd-vhosts.conf) - 运行
apachectl -t验证语法,再systemctl reload httpd(或apache2)重载配置 - 若使用基于名称的虚拟主机(
*:80),NameVirtualHost *:80在 Apache 2.4+ 中已非必需,但保留可提升可读性










