服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-24 简米科技 3,705 字 9 分钟阅读

apache虚拟机如何配置多个别名?,apache虚拟主机多域名配置方法

导读Apache虚拟机配置多个别名的核心方法是在一个VirtualHost块内使用多条ServerAlias指令,或者用空格分隔多个域名,不需要为每个别名单独创建虚拟主机, 你只需要在现有虚拟主机配置里加上别名,重新加载Apache就能让多个域名访问同一套网站内容,但别着急,实际配置中有几个容易踩的坑,尤其是通配符……

Apache虚拟机配置多个别名的核心方法是在一个VirtualHost块内使用多条ServerAlias指令,或者用空格分隔多个域名,不需要为每个别名单独创建虚拟主机。 你只需要在现有虚拟主机配置里加上别名,重新加载Apache就能让多个域名访问同一套网站内容,但别着急,实际配置中有几个容易踩的坑,尤其是通配符和默认站点干扰,下面我一步步拆解给你看。

Apache虚拟主机多个域名怎么配置:先记住这条核心规则

在Apache里,虚拟主机(VirtualHost)通过ServerName和ServerAlias两个指令来绑定域名。ServerName是主域名,ServerAlias是附加别名,多个别名可以放在同一行,用空格隔开,也可以写成多行,效果完全相同。

你有一个网站www.example.com,还想让example.com和example.net也访问同一套页面,配置如下:

<VirtualHost :80>
    ServerName www.example.com
    ServerAlias example.com example.net
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

这个配置写在Apache的主配置文件httpd.conf里,或者在Debian/Ubuntu系统下,放在/etc/apache2/sites-available/目录下的站点配置文件中,完成后执行apachectl configtest检查语法,再systemctl reload httpd(CentOS)或service apache2 reload(Ubuntu)生效。

多个别名之间用空格还是逗号?只用空格,不用逗号、分号,同一个ServerAlias指令写多个域名可以,拆成多条指令也可以:

ServerAlias example.com
ServerAlias example.net
ServerAlias example.org

两种写法在Apache里完全等价,行业共识认为,域名较多时建议拆成多行,方便以后删除和备注。

两种多别名的写法对比:静态列表与通配符模式

如果你有具体的几个域名,用静态列表就够了,但如果你有一个主域名,想自动匹配所有子域名,则可以使用通配符,Apache的ServerAlias支持通配符,但要注意:只能匹配一个标签段,也就是说,.example.com能匹配blog.example.com、shop.example.com,但不能匹配sub.blog.example.com。

写法如下:

<VirtualHost :80>
    ServerName example.com
    ServerAlias .example.com
    DocumentRoot /var/www/html
</VirtualHost>

这样,任何子域名(仅限一级)都会指向同一份网站内容,下表是静态列表和通配符的对比,方便你按场景选择:

场景 写法 匹配范围 适用情况
明确的两个或三个域名 ServerAlias a.com b.com 仅限列出域名 公司官网,国内外都有不同后缀
多个不同主域名 ServerAlias .a.com .b.com 每个域名的所有子域名 同一套应用,多个品牌共用
动态增加的子域名 ServerAlias .dev.example.com 该域名下所有子域 测试环境

通配符模式有个明显的好处:以后新增子域名时,不用再改配置,但代价是,所有子域名都会响应同一个站点,如果你希望不同子域名跳转到不同目录,那就不能用通配符,得拆成多个虚拟主机块。

这里有一个常见疑惑:ServerAlias和ServerName的优先级是怎样的?Apache匹配请求时,会先精确匹配ServerName和ServerAlias中列出的域名,如果都没有匹配上,就把请求交给默认虚拟主机(通常是配置文件中第一个加载的VirtualHost,或者用_default_指定的主机),所以如果你配了别名但还是访问到了默认页面,问题多半是别名没有生效,或默认虚拟主机把请求抢走了。

配置多个别名时常见的默认站点干扰问题

很多人在本地调试时,明明在ServerAlias里写了test.com,但浏览器打开test.com,显示的却是Apache欢迎页或者另一个网站,这不是Apache不认你写的别名,而是默认虚拟主机在捣乱。

在CentOS的/etc/httpd/conf.d/welcome.conf或Ubuntu的/etc/apache2/sites-available/000-default.conf里,有一个默认虚拟主机,它响应所有没有匹配到其他VirtualHost的请求,如果你自定义的虚拟主机没有成功加载,或者ServerAlias写错了,请求就会落入默认虚拟主机。

解决办法分两步:

  • 用命令检查你的站点是否已经启用:apachectl -S会列出所有虚拟主机以及它们对应的ServerName和ServerAlias,查看你的别名是否在列表中。
  • 确认默认虚拟主机是否在干扰,如果apachectl -S显示default站点监听:80,而你的站点也监听:80,那么Apache会根据加载顺序来匹配,在CentOS上,通常conf.d下的文件按字母顺序加载,welcome.conf可能排在你的站点之前。

最稳妥的解决办法是显式禁用默认虚拟主机,在Ubuntu上执行a2dissite 000-default.conf,再重载Apache,在CentOS上,将/etc/httpd/conf.d/welcome.conf改名或注释掉<LocationMatch>部分。

如果同一个IP上配置了多个虚拟主机,且你希望某个别名只属于特定站点,那么请确保没有把相同的别名写进两个VirtualHost里,Apache不会报错,但只会匹配第一个出现的虚拟主机,容易引起混乱。

多别名配置后的验证方法:你看到的未必是真的

配置完成后,不要急着用浏览器刷新,浏览器缓存和本地DNS解析可能掩盖真相,推荐用curl直接测试:

curl -I -H "Host: blog.example.com" http://127.0.0.1

这个命令会跳过DNS,直接把请求发给本机Apache,同时模拟Host头为blog.example.com,如果你看到HTTP 200和你的网站页面头信息,说明别名已经生效;如果返回403或默认页面,说明请求被默认虚拟主机接收了。

还有一种情况:你的Apache前面有Nginx反代,那么配置要在Nginx层也同步处理,Apache的别名只影响Apache自己监听的请求,如果Nginx把某个域名的请求转发给后端程序,则需要在Nginx的server_name里也加上对应域名,否则用户访问该域名时,Nginx会返回401或找不到站点,这种场景下,Apache的ServerAlias只是其中一环,不能单独决定最终结果。

Apache虚拟主机配置多个别名常见问题Q&A

问:ServerAlias最多能配置多少个域名?

没有明确限制,它只是以空格分隔的字符串,你可以写几十个甚至上百个,但域名越多,Apache启动时解析配置的时间会略有增加,如果超过几十个,建议考虑用通配符或者改用手写配置模块来管理。

问:多个域名配置了相同别名,访问时会出现什么情况?

Apache会按照虚拟主机的加载顺序,将请求匹配到第一个包含该别名的虚拟主机,后面的同名别名不会生效,为了避免这种问题,用apachectl -S检查所有虚拟主机,确保别名没有重复。

问:想让a.com和b.com访问不同目录,但共用同一套PHP代码,应该用别名还是一个虚拟主机?

应该拆成两个虚拟主机。ServerAlias的含义是别名指向同一内容,无法做到不同域名对应不同目录,如果你需要根据域名加载不同数据库或配置,请在代码层读取HTTP_HOST并做分支,Apache这边配置两个VirtualHost,DocumentRoot可以指向同一路径,然后在代码里区分配置,这也是业内常见的做法,用别名只解决同站同域名问题,不解决差异化逻辑。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱