根本原因是Apache未匹配到ServerName,导致请求回退至第一个VirtualHost;需启用NameVirtualHost(2.2及以前)、确保ServerName与Host头完全一致、检查hosts解析,并用apachectl -S验证加载顺序。
这个问题很常见:多个基于域名的虚拟主机都配置好了,但访问任意一个自定义域名时,页面总是显示 apache 默认站点(比如 /var/www/html 的内容),或者全部落到第一个 virtualhost 块里。根本原因不是配置写错了,而是 apache 没有成功匹配到你期望的 servername,导致请求回退到了默认处理逻辑。
确认 NameVirtualHost 已启用(Apache 2.4 以前需手动开启)
在 Apache 2.2 及更早版本中,必须显式声明监听端口支持基于名称的虚拟主机:
- 打开
httpd.conf或主配置文件,找到类似#NameVirtualHost *:80的行 - 去掉开头的
#,改为NameVirtualHost *:80 - Apache 2.4+ 默认启用该功能,无需此行;若存在反而可能报错,建议直接删除
检查 ServerName 和 Host 请求头是否一致
Apache 匹配虚拟主机时,严格比对 HTTP 请求头中的 Host 字段与 ServerName / ServerAlias 的值(区分大小写、不带协议、不含端口):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 确保浏览器访问的是纯域名,例如
http://example.com,而不是http://example.com/或https://example.com(HTTPS 需单独配置 443 端口的VirtualHost) - 检查
httpd-vhosts.conf中每个站点的ServerName是否和你在 hosts 或 DNS 中设置的一致,比如写的是www.example.com,就不要用example.com访问,除非加了ServerAlias example.com - 推荐为每个站点加上
ServerAlias覆盖常见变体:ServerName example.com<br>ServerAlias www.example.com *.example.com
验证虚拟主机加载顺序与默认兜底行为
Apache 在没有匹配到任何 ServerName 时,会使用当前监听端口下“第一个定义的 VirtualHost”作为默认响应——这正是你看到所有请求都跳到某个站点的原因:
- 把最通用或最可能被误访问的站点(如公司官网)放在配置文件最前面,并显式标记为默认:
<VirtualHost *:80><br> ServerName default-site<br> DocumentRoot /var/www/default<br> <Location "/"><br> Require all denied<br> </Location><br></VirtualHost>
- 或者,在监听语句中添加
default_server(仅限 Nginx;Apache 不支持该关键字,但可通过将兜底块置于首位+限制访问来模拟) - 运行
apachectl -S查看 Apache 实际加载的虚拟主机列表和匹配顺序,输出中会标明哪个是*:80 is a NameVirtualHost下的默认项
排查本地解析与服务状态
即使 Apache 配置正确,前端请求也可能根本没走到它那里:
- 确认系统
/etc/hosts文件已添加对应条目,格式为:127.0.0.1 example.com<br>127.0.0.1 www.example.com
注意不要有多余空格或中文字符 - 重启 Apache 并检查语法:
apachectl configtest(应返回Syntax OK)systemctl restart httpd(CentOS/RHEL)或systemctl restart apache2(Ubuntu/Debian) - 用
curl -H "Host: example.com" http://127.0.0.1模拟请求,绕过 DNS 和浏览器缓存,直接测试 Apache 内部路由是否生效

















