Apache虚拟主机配置转发实现多站点与请求重定向的完整指南
海外云服务器 40个地区可选 亚太云服务器 香港 日本 韩国
云虚拟主机 个人和企业网站的理想选择 俄罗斯电商外贸虚拟主机 赠送SSL证书
美国云虚拟主机 助力出海企业低成本上云 WAF网站防火墙 为您的业务网站保驾护航
在现代 Web 服务器部署架构中,Apache HTTP Server 作为全球最广泛使用的开源 Web 服务器之一,长期服务于各类网站和企业级应用系统,随着业务规模的不断扩展,单一物理服务器往往需要同时承载多个域名或子域名的服务需求,为实现资源高效利用,Apache 提供了强大的 虚拟主机(Virtual Host) 功能,支持在同一台服务器上运行多个独立站点。
当面临网站重构、域名迁移、服务拆分或负载均衡等场景时,仅靠静态托管已无法满足需求,还需对客户端请求进行智能转发或重定向,本文将深入探讨如何基于 Apache 的虚拟主机机制,结合核心模块 mod_proxy
和 mod_rewrite
,实现灵活高效的请求转发策略,涵盖从基础配置到复杂应用场景的完整实践路径。
什么是 Apache 虚拟主机?
Apache 虚拟主机技术允许一台物理服务器对外提供多个独立网站的服务能力,每个站点可通过不同的域名访问,而无需为每个域名单独配置独立的硬件或 IP 地址,这种“一机多站”的模式极大提升了服务器资源利用率,降低了运维成本。
根据识别方式的不同,Apache 支持两种主要类型的虚拟主机:
-
基于名称的虚拟主机(Name-based Virtual Host)
利用 HTTP 请求头中的Host
字段来区分不同目标站点,适用于多个域名共享同一公网 IP 的场景,这是目前最常见且经济高效的部署方式。 -
基于 IP 的虚拟主机(IP-based Virtual Host)
每个站点绑定唯一的 IP 地址,通过监听不同 IP 实现隔离,该方式适合拥有多个公网 IP 的环境,常用于高安全要求或 SSL/TLS 证书受限的历史场景。
⚠️ 注意:由于 IPv4 地址资源紧张以及 SNI(Server Name Indication)技术的普及,当前绝大多数 HTTPS 站点也已支持基于名称的虚拟主机,基于名称的方式已成为主流选择。
启用虚拟主机的基本配置流程
在开始配置请求转发之前,必须确保 Apache 已正确启用虚拟主机功能并加载必要的模块。
确保关键模块已启用
Apache 的虚拟主机功能依赖于 mod_vhost_alias
等模块的支持,大多数 Linux 发行版默认已包含这些模块,但仍建议检查并手动启用:
sudo a2enmod vhost_alias
在主配置文件(如 /etc/apache2/apache2.conf
或 /etc/httpd/conf/httpd.conf
)中应包含如下指令,用于动态加载站点配置:
IncludeOptional sites-enabled/*.conf
此语句表示 Apache 将自动读取 /etc/apache2/sites-enabled/
目录下的所有 .conf
文件作为站点配置。
创建并启用虚拟主机配置
以域名为 example.com
的站点为例,在 /etc/apache2/sites-available/
目录下创建配置文件 example.com.conf
:
<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/example <Directory "/var/www/example"> AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/example_error.log CustomLog ${APACHE_LOG_DIR}/example_access.log combined </VirtualHost>
配置说明:
ServerName
定义主域名;DocumentRoot
指定网页根目录;<Directory>
块设置访问权限;- 日志路径可自定义,便于后续排查问题。
保存后执行以下命令启用站点:
sudo a2ensite example.com.conf sudo systemctl reload apache2
只要 DNS 正确解析至服务器 IP,即可通过浏览器访问该站点。
核心转发技术详解:mod_proxy
与 mod_rewrite
Apache 实现请求转发的核心依赖两个强大模块:mod_proxy
和 mod_rewrite
,二者用途不同但可协同工作,分别适用于反向代理和 URL 重写场景。
使用 mod_proxy
实现反向代理转发
mod_proxy
是 Apache 的代理网关模块,能够将客户端请求透明地转发至后端应用服务器(如 Node.js、Tomcat、Spring Boot 等),并返回响应结果,常用于前后端分离架构或微服务集成。
启用代理相关模块
sudo a2enmod proxy sudo a2enmod proxy_http
若需支持 WebSocket 或 HTTPS 后端,还需启用:
sudo a2enmod proxy_wstunnel sudo a2enmod proxy_https
配置示例:API 请求代理
假设有一个运行在本地 3000
端口的 Node.js 应用,希望通过子域名 api.example.com
对外暴露服务:
<VirtualHost *:80> ServerName api.example.com ProxyPreserveHost On ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/ ErrorLog ${APACHE_LOG_DIR}/api_error.log CustomLog ${APACHE_LOG_DIR}/api_access.log combined </VirtualHost>
关键参数解释:
ProxyPreserveHost On
:保持原始 Host 请求头不变,有助于后端日志记录和鉴权判断;ProxyPass
:定义路径映射规则,将前端请求转发至指定后端地址;ProxyPassReverse
:改写后端返回的响应头(如Location
),避免跳转错误。
✅ 提示:该配置实现了典型的“反向代理”模型——客户端无感知地访问后端服务,增强了安全性与架构解耦。
使用 mod_rewrite
实现 URL 重写与重定向
mod_rewrite
是 Apache 最灵活的 URL 控制工具,可用于实现 SEO 友好链接、旧链接跳转、HTTPS 强制跳转、条件路由等多种高级功能。
启用模块
sudo a2enmod rewrite
示例 1:永久重定向旧域名
当网站更换域名时,可通过 301 跳转保留搜索引擎权重:
<VirtualHost *:80> ServerName oldsite.com RewriteEngine On RewriteRule ^/(.*)$ http://newsite.com/$1 [R=301,L] </VirtualHost>
规则解析:
RewriteEngine On
:开启重写引擎;^(.*)$
:匹配任意路径;[R=301,L]
:返回 HTTP 301 永久重定向状态码,L
表示停止后续规则处理。
示例 2:基于用户代理的条件转发
某些接口可能只允许特定客户端访问,CLI 工具 curl
:
RewriteCond %{HTTP_USER_AGENT} ^curl [NC] RewriteRule ^/data\.json$ /api/v1/data [P]
说明:
RewriteCond
设置前置条件,[NC]
表示忽略大小写;[P]
标志表示使用代理方式转发(内部调用mod_proxy
),而非普通跳转;- 此请求将以代理形式转发至
/api/v1/data
,外部仍显示原始 URL。
💡 应用场景:为开发者提供简洁的数据接口入口,同时隐藏真实后端路径。
综合实战案例:前后端分离架构中的统一入口配置
在典型的前后端分离项目中,前端使用 Vue/React 构建单页应用(SPA),部署于 Apache 静态服务;后端采用 Spring Boot 提供 RESTful API,运行在独立进程,我们希望用户通过统一域名访问,内部自动分流请求。
需求描述
- 域名:
app.example.com
- 前端资源存放于
/var/www/frontend
- 后端 API 运行在
http://localhost:8080/api
- 支持 WebSocket 实时通信
- SPA 路由刷新不报 404
完整配置如下:
IncludeOptional sites-enabled/*.conf0