
apache 会按顺序匹配 virtualhost,当 ssl 配置文件错误监听在 *:80 而非 *:443 时,该配置会劫持所有未明确匹配的 http 请求(包括其他域名),导致多站点共用同一 documentroot。
apache 会按顺序匹配 virtualhost,当 ssl 配置文件错误监听在 *:80 而非 *:443 时,该配置会劫持所有未明确匹配的 http 请求(包括其他域名),导致多站点共用同一 documentroot。
在 Apache 中,VirtualHost 的匹配逻辑严格依赖 IP:端口 + ServerName 组合。若多个 <VirtualHost> 声明监听相同端口(如全部为 *:80),Apache 将按配置文件加载顺序(通常为字母序或启用顺序)进行匹配,并将首个满足 IP 和端口条件、且 ServerName 或 ServerAlias 匹配请求 Host 头的虚拟主机作为处理目标;若无精确匹配,则 fallback 到第一个定义的 *:80 虚拟主机。
本例中,phpmyadmin_ssl.conf 错误地配置为 <VirtualHost *:80>,却同时启用了 SSLEngine on —— 这不仅技术上无效(HTTP 端口无法处理 HTTPS 加密流量),更关键的是:它使该配置成为 *:80 下一个「合法但语义矛盾」的虚拟主机。当用户访问 http://phpmyadmin.aws1.company.de 时,Apache 在 *:80 上查找匹配 ServerName phpmyadmin.aws1.company.de 的 VirtualHost,成功命中;但当访问 http://test.api.konfigurator.company.de 时,因 test_api_konfigurator.conf 已正确定义 ServerName,故正常响应。问题出现在 HTTPS 请求路径:
- https://phpmyadmin.aws1.company.de 应由 *:443 的 phpmyadmin_ssl.conf 处理;
- 但原配置中 phpmyadmin_ssl.conf 实际监听 *:80,因此 Apache 在 *:443 上找不到匹配项;
- 此时 Apache 退回到 *:443 下第一个定义的 VirtualHost —— 即 test_api_konfigurator_ssl.conf(因其 <VirtualHost *:443> 是唯一正确监听 443 的配置),导致所有 HTTPS 请求(无论 Host 头为何)均被路由至 /var/www/company/... 目录。
✅ 正确修复方式是将 phpmyadmin_ssl.conf 的监听端口明确改为 *:443,并确保其 ServerName 唯一且与 DNS 解析一致:
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
<VirtualHost *:443>
ServerName phpmyadmin.aws1.company.de
DocumentRoot /usr/share/phpmyadmin
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/company/hoster_cert"
SSLCertificateKeyFile "/etc/ssl/certs/company/hoster_key"
<Directory /usr/share/phpmyadmin>
Require all granted
Options FollowSymLinks
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/phpmyadmin_error.log
CustomLog ${APACHE_LOG_DIR}/phpmyadmin_access.log combined
</VirtualHost>⚠️ 同时注意以下关键点:
- 所有 *:443 的 VirtualHost 必须启用 SSLEngine on,否则 Apache 启动会报错;
- *:80 的配置中禁止出现 SSLEngine 指令(语法错误);
- 使用 sudo apache2ctl -S 验证当前生效的 VirtualHost 映射,输出中应清晰列出每个 *:80 和 *:443 的 ServerName 及 DocumentRoot;
- 修改后务必执行 sudo systemctl reload apache2(而非 restart),以避免连接中断;
- 若启用 HTTP/HTTPS 混合重定向(如 http → https),需确保 *:80 配置中仅含 RewriteRule,不包含 SSL 相关指令。
最终,四个 VirtualHost 应严格按端口分离:
- *:80:仅处理纯 HTTP 请求,含 RewriteRule 强制跳转;
- *:443:仅处理 HTTPS 请求,每个域名独占一个 <VirtualHost *:443> 块,且 ServerName 不可重复。
如此配置后,https://phpmyadmin.aws1.company.de 将正确加载 /usr/share/phpmyadmin/,而 https://test.api.konfigurator.company.de 则加载其对应项目目录,彻底解决交叉响应问题。

















