Apache 2.4 如何配置虚拟主机支持多个域名指向不同目录

文章导读
Apache 2.4 配置多域名指向不同目录,本质是利用基于名称的虚拟主机(Name-based Virtual Hosts)功能,通过为每个域名编写独立的<VirtualHost>配置块来实现,这是官方推荐的标准做法。
📋 目录
  1. 多域名配置示例
  2. 工作原理
  3. 实施步骤
  4. 验证方法
  5. 常见故障排查
  6. 参考来源
A A

Apache 2.4 配置多域名指向不同目录,本质是利用基于名称的虚拟主机(Name-based Virtual Hosts)功能,通过为每个域名编写独立的<VirtualHost>配置块来实现,这是官方推荐的标准做法。

先说结论:Apache 2.4 原生支持多域名配置,不需要额外模块,重点在于正确设置 ServerName 和 DocumentRoot 并确保权限无误。

  • 适合:单台服务器需要托管多个不同域名的网站场景。
  • 先准备:确认域名已解析到服务器 IP,且服务器 80 或 443 端口未被占用。
  • 验收:使用 curl 命令模拟 Host 头请求,确认返回内容对应正确的目录。

多域名配置示例

下面是一个典型的多虚拟主机配置片段,展示了两个域名分别指向不同目录的结构。注意路径和域名需要替换为实际值。

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    DocumentRoot /var/www/example
    <Directory /var/www/example>
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName www.test.com
    ServerAlias test.com
    DocumentRoot /var/www/test
    <Directory /var/www/test>
        Require all granted
    </Directory>
</VirtualHost>

工作原理

Apache 处理请求时,会读取 HTTP 请求头中的 Host 字段,然后匹配配置文件中 ServerName 或 ServerAlias 一致的 VirtualHost 块。在 Apache 2.2 时代需要配置 NameVirtualHost 指令,但在 2.4 版本中该指令已废弃,只要使用 IP:Port 或*:Port 形式定义 VirtualHost,默认就是基于名称的虚拟主机。

实施步骤

1. 确认配置加载路径:检查主配置文件 httpd.conf 中是否包含 Include 指令。通常在文件末尾会有类似 IncludeOptional conf.d/*.conf 的配置。如果没有,新建的配置文件不会被加载。

Apache 2.4 如何配置虚拟主机支持多个域名指向不同目录

2. 准备目录:为每个网站创建独立的文件夹,并设置好权限,确保 Apache 运行用户(如 apache 或 www-data)有读取权限。

3. 编写配置:在 conf.d 目录下新建配置文件(需确保 httpd.conf 已包含 IncludeOptional conf.d/*.conf),填入 VirtualHost 块,每个域名一个块。

4. 检查语法:运行 apachectl configtest 或 httpd -t 确保没有拼写错误,避免重启失败。

5. 重启服务:执行 systemctl restart httpd 或 apache2 使配置生效,生产环境建议先 reload。

Apache 2.4 如何配置虚拟主机支持多个域名指向不同目录

验证方法

不要直接在浏览器输入 IP 访问,因为浏览器默认发送的是 IP 地址作为 Host。建议在终端使用 curl 命令指定 Host 头进行测试,例如 curl -H "Host: www.example.com" http://服务器 IP/。同时查看 access_log 日志,确认请求被记录到了对应的虚拟主机日志中。

常见故障排查

1. 权限问题:DocumentRoot 目录如果没有读取权限,会返回 403 Forbidden,需检查 SELinux 或文件系统权限。

2. 默认主机:如果没有匹配到任何 ServerName,请求会落入第一个定义的 VirtualHost,通常建议显式配置一个默认站点。

Apache 2.4 如何配置虚拟主机支持多个域名指向不同目录

3. 端口监听:确保 httpd.conf 中 Listen 指令包含了你配置的端口,否则 Apache 不会监听该端口。

4. 配置未生效:确认配置文件是否被 httpd.conf 通过 Include 指令引入,且文件名后缀通常为 .conf。

参考来源

Apache HTTP Server 官方文档 - Virtual Host Examples

URL: https://httpd.apache.org/docs/2.4/vhosts/examples.html