Apache2中单个子域名VirtualHost无法访问问题排查求助
核心问题
在Apache 2.4.48(Ubuntu)的000-default.conf中配置coltd.domain.mo的VirtualHost后,该子域名无法访问;但*.domain.mo/coltd/可正常访问,将该子域名配置单独拆分到coltd.domain.mo.conf并禁用000-default.conf后可恢复访问,且已确认配置语法正确、服务运行正常、VirtualHost已加载。
可能原因
VirtualHost优先级冲突
Apache 2.4中,监听相同端口的VirtualHost会按配置文件内的顺序匹配,第一个匹配的规则会作为默认站点。如果000-default.conf中先定义了通用的*:80VirtualHost(比如默认的主站配置),后续的coltd.domain.mo配置会被前面的规则覆盖,请求被导向默认站点目录。配置文件内逻辑冲突
虽然apache2ctl configtest返回syntax OK,但可能存在隐性逻辑冲突:- 文件内存在重复的
ServerName/ServerAlias配置,比如某个VirtualHost使用了ServerAlias *.domain.mo,会优先拦截所有子域名请求 - 前面的VirtualHost配置了全局
RewriteRule或Alias规则,覆盖了coltd.domain.mo的路由 <Directory>权限块的顺序错误,导致/var/www/co_ltd的权限配置未生效
- 文件内存在重复的
配置加载顺序的隐性影响
若000-default.conf与其他已启用的配置文件存在规则重叠,但单独拆分配置后正常,说明问题集中在000-default.conf内部。
解决方法
方法1:调整VirtualHost顺序
将coltd.domain.mo的VirtualHost配置移到000-default.conf的最顶部,确保它是第一个被匹配的规则:
<VirtualHost *:80> ServerName coltd.domain.mo DocumentRoot /var/www/co_ltd <Directory /var/www/co_ltd> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/coltd-error.log CustomLog ${APACHE_LOG_DIR}/coltd-access.log combined </VirtualHost> # 其他原有VirtualHost配置放在下方 <VirtualHost *:80> ServerName domain.mo DocumentRoot /var/www/html ... </VirtualHost>
修改后执行:
sudo systemctl reload apache2
测试访问coltd.domain.mo。
方法2:排查并移除冲突规则
- 查找文件内是否存在
ServerAlias *.domain.mo这类全局子域名规则,若有则移除,或为coltd.domain.mo单独配置更高优先级的规则。 - 检查全局Rewrite规则,若存在拦截所有子域名的规则,添加例外条件:
RewriteCond %{HTTP_HOST} !^coltd\.domain\.mo$ RewriteCond %{HTTP_HOST} ^.*\.domain\.mo$ RewriteRule ^/(.*)$ /var/www/html/$1 [L]
方法3:临时拆分配置(过渡方案)
提前执行计划中的拆分操作,将coltd.domain.mo配置单独存入/etc/apache2/sites-available/coltd.domain.mo.conf,然后启用该配置:
sudo a2ensite coltd.domain.mo.conf sudo systemctl reload apache2
保留000-default.conf内的其他配置,既解决当前问题,也为后续完全拆分做铺垫。
方法4:检查目录权限
确认/var/www/co_ltd的权限符合Apache运行要求:
sudo chown -R www-data:www-data /var/www/co_ltd sudo chmod -R 755 /var/www/co_ltd
若服务器启用SELinux,需调整安全上下文:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/co_ltd(/.*)?" sudo restorecon -Rv /var/www/co_ltd
内容的提问来源于stack exchange,提问作者swlok

