求助:在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,提问作者Денис
相关产品推荐
相关产品推荐

