Apache不负责DNS解析,而是依赖客户端请求的Host头实现基于名称的虚拟主机;2.4+版本已移除NameVirtualHost指令,只需配置VirtualHost并设置ServerName/ServerAlias即可自动路由。Apache 本身不负责 DNS 域名解析,它依赖客户端请求中携带的 `Host` 请求头来区分不同域名。所谓“通过 NameVirtualHost 实现域名解析分发”,实际是指**基于名称的虚拟主机(Name-based Virtual Host)**,这是 Apache 在单 IP 上托管多个域名的核心机制。 在 Apache 2.4 及以后版本中,`NameVirtualHost` 指令**已被移除**,不再需要也不允许手动配置。它的功能已自动集成:只要定义了 `
确认 Apache 已启用虚拟主机支持
检查主配置文件(如 /etc/httpd/conf/httpd.conf 或 /etc/apache2/apache2.conf)中是否已加载虚拟主机配置:
- CentOS/RHEL:确保以下行未被注释:
Include conf/extra/httpd-vhosts.conf - Ubuntu/Debian:确保启用了 sites-enabled:
IncludeOptional sites-enabled/*.conf - 运行语法检查:
sudo httpd -t(CentOS)或sudo apache2ctl -t(Ubuntu),输出 Syntax OK 才继续
配置基于名称的虚拟主机(关键步骤)
以两个域名为例:www.site1.com 和 www.site2.com,共用同一 IP(如 192.168.1.100):
- 为每个站点创建独立目录:
sudo mkdir -p /var/www/site1.com/public_htmlsudo mkdir -p /var/www/site2.com/public_html - 设置权限(Linux):
sudo chown -R $USER:apache /var/www/site1.com(CentOS)sudo chmod -R 755 /var/www/site1.com - 写入测试页,例如:
echo "<h1>Site 1</h1>" > /var/www/site1.com/public_html/index.html - 编辑虚拟主机配置文件(如 /etc/httpd/conf/extra/httpd-vhosts.conf):
<VirtualHost *:80><br> ServerName www.site1.com<br> ServerAlias site1.com<br> DocumentRoot "/var/www/site1.com/public_html"<br> <Directory "/var/www/site1.com/public_html"><br> Require all granted<br> AllowOverride All<br> </Directory><br></VirtualHost><br><br><VirtualHost *:80><br> ServerName www.site2.com<br> ServerAlias site2.com<br> DocumentRoot "/var/www/site2.com/public_html"<br> <Directory "/var/www/site2.com/public_html"><br> Require all granted<br> AllowOverride All<br> </Directory><br></VirtualHost>
本地测试与 DNS 解析配合
在生产环境前,可先用本地 hosts 文件模拟 DNS 解析:
- 编辑 /etc/hosts(Linux/macOS)或 C:\Windows\System32\drivers\etc\hosts(Windows):
192.168.1.100 www.site1.com192.168.1.100 www.site2.com - 保存后,在浏览器分别访问
http://www.site1.com和http://www.site2.com,应看到不同页面 - 真实上线时,需在公共 DNS(如阿里云、Cloudflare)中将这两个域名 A 记录指向服务器公网 IP
重启服务并验证
完成配置后执行:
-
sudo systemctl restart httpd(CentOS/RHEL)
或sudo systemctl restart apache2(Ubuntu/Debian) - 检查端口监听:
sudo ss -tlnp | grep :80 - 用 curl 测试 Host 头路由:
curl -H "Host: www.site1.com" http://127.0.0.1curl -H "Host: www.site2.com" http://127.0.0.1


















