You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在Apache中配置主域名与通配符子域的目录映射

Apache 虚拟主机配置:主域与泛子域分离

方法一:拆分两个独立VirtualHost(推荐)

直接给主域和所有子域分别配置虚拟主机,逻辑更清晰,后续改配置也方便:

# 主域 example.ru 配置
<VirtualHost *:80>
    ServerAdmin support@example.ru
    ServerName example.ru
    DocumentRoot /var/www/example.ru

    ErrorLog ${APACHE_LOG_DIR}/example.ru-error.log
    CustomLog ${APACHE_LOG_DIR}/example.ru-access.log combined
</VirtualHost>

# 所有子域 *.example.ru 配置
<VirtualHost *:80>
    ServerAdmin support@example.ru
    ServerName subdomain.example.ru  # 随便填一个合法子域当标识,主要靠ServerAlias匹配所有子域
    ServerAlias *.example.ru
    DocumentRoot /var/www/subdomain

    ErrorLog ${APACHE_LOG_DIR}/subdomain.example.ru-error.log
    CustomLog ${APACHE_LOG_DIR}/subdomain.example.ru-access.log combined
</VirtualHost>
  • Apache会自动根据请求的域名匹配对应的虚拟主机
  • 分开日志文件,排查问题时更容易定位

方法二:修复原有的Rewrite规则

你原来的配置问题出在RewriteRule直接用物理路径时没加必要的标志,调整后如下:

<VirtualHost *:80>
    ServerAdmin support@example.ru
    ServerName example.ru
    ServerAlias *.example.ru
    DocumentRoot /var/www/example.ru

    RewriteEngine On
    # 排除主域,只匹配子域请求
    RewriteCond %{HTTP_HOST} !^example\.ru$ [NC]
    RewriteCond %{HTTP_HOST} ^.+\.example\.ru$ [NC]
    # 加PT标志,让Apache把重写后的路径当作URL路径处理
    RewriteRule ^(.*)$ /var/www/subdomain/$1 [L,PT]

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  • PT是核心,没有它Apache会把重写后的路径当成URL而不是文件系统路径,导致无法正确访问
  • 简化了条件判断,直接排除主域请求

配置改完后记得重启Apache生效:

# Debian/Ubuntu 系统
sudo systemctl restart apache2

# CentOS/RHEL 系统
sudo systemctl restart httpd

内容的提问来源于stack exchange,提问作者Денис

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:11:25