Apache(httpd)域名别名设置指南
核心概念
域名别名(如 www.example.com
指向 example.com
)或多域名共享同一站点时,需通过 Apache 配置实现,常见场景包括:
ServerAlias
VirtualHost
使用 ServerAlias
配置步骤
-
确认模块加载
确保mod_vhost
已启用(默认开启):a2enmod vhost # Debian/Ubuntu
-
编辑主配置文件
打开httpd.conf
或对应虚拟主机配置文件:<VirtualHost :80> ServerAdmin webmaster@example.com DocumentRoot /var/www/html ServerName example.com # 添加别名(可多个) ServerAlias www.example.com blog.example.com # 其他配置... ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
-
重启服务
systemctl restart httpd # 或 apache2
使用多 VirtualHost
配置
当不同域名需要独立配置时(如不同文档根),需为每个域名定义单独的 <VirtualHost>
块:
<VirtualHost :80> ServerName example.com DocumentRoot /var/www/example # 其他配置... </VirtualHost> <VirtualHost :80> ServerName www.example.com DocumentRoot /var/www/example # 可覆盖特定配置,如重定向规则 Redirect permanent / https://example.com/ </VirtualHost>
HTTPS 配置注意事项
若启用 SSL,需为每个域名配置证书。推荐使用通配符证书(如 .example.com
)简化多域名管理:
<VirtualHost :443> ServerName example.com ServerAlias www.example.com SSLEngine on SSLCertificateFile /path/to/cert.pem SSLCertificateKeyFile /path/to/key.pem # 其他配置... </VirtualHost>
常见问题排查
问题 | 解决方案 |
---|---|
配置生效但访问异常 | 检查 ServerName 和 ServerAlias 是否拼写正确,DNS 解析是否正常 |
出现 “重复的虚拟主机” 错误 | 确保同一 IP+端口组合下 ServerName 唯一,或合并相同配置的 VirtualHost 块 |
SSL 证书报错 | 确认证书文件路径正确,或使用 SSLCertificateChainFile 配置中间证书链 |
相关问题与解答
问题1:如何让多个子域名共享同一站点但保留独立日志?
解答:
为每个子域名创建独立的 <VirtualHost>
,指定相同 DocumentRoot
但不同日志文件:
<VirtualHost :80>
ServerName sub1.example.com
DocumentRoot /var/www/main
CustomLog /var/log/apache2/sub1_access.log combined
ErrorLog /var/log/apache2/sub1_error.log
</VirtualHost>
<VirtualHost :80>
ServerName sub2.example.com
DocumentRoot /var/www/main
CustomLog /var/log/apache2/sub2_access.log combined
ErrorLog /var/log/apache2/sub2_error.log
</VirtualHost>
问题2:如何强制所有别名跳转到主域名?
解答:
在次要域名的 <VirtualHost>
中添加重定向规则:
<VirtualHost :80> ServerName www.example.com Redirect permanent / https://example.com/ </VirtualHost>
或使用 mod_rewrite
:
<VirtualHost :80> ServerName www.example.com DocumentRoot /var/www/html <Directory "/var/www/html"> RewriteEngine On RewriteCond %{HTTP_HOST} !^example.com$ [NC] RewriteRule ^(.)$ https://example.com/$1 [L,R=301] </Directory> </VirtualHost>