如何使用Apache 2.4的mod_rewrite或mod_proxy实现旧域名到新域名的透明转发(不改变浏览器URL)
如何使用Apache 2.4的mod_rewrite或mod_proxy实现旧域名到新域名的透明转发(不改变浏览器URL)
嘿,刚好碰到过类似的迁移场景,给你梳理两种靠谱的实现方式,完全满足你“用户无感知、URL不变化”的需求,还能配合你的回退策略:
一、推荐用mod_proxy反向代理(最稳定的透明转发方案)
这是Apache官方推荐的反向代理方式,比mod_rewrite更直接,适合这种域名迁移的场景。
步骤1:先启用必要的模块
如果你用的是Debian/Ubuntu系服务器,先执行这两条命令启用模块:
a2enmod proxy a2enmod proxy_http
如果是CentOS/RHEL或者手动配置httpd.conf的话,要确保配置文件里有这两行(没有就加上):
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
步骤2:配置转发规则
你可以选择配置在旧服务器的VirtualHost里(推荐,比.htaccess效率更高),或者用.htaccess(需要先确保VirtualHost里开启了AllowOverride All)。
方式A:VirtualHost配置(推荐)
找到旧域名对应的VirtualHost配置,改成下面这样:
<VirtualHost *:80> ServerName example1.mycompany.com # 保留请求的Host头,确保新服务器能识别原域名(如果你的应用依赖Host的话) ProxyPreserveHost On # 把所有请求转发到新服务器 ProxyPass / http://example2.mycompany.com/ # 处理新服务器返回的重定向,自动把新域名替换回旧域名,避免浏览器URL变化 ProxyPassReverse / http://example2.mycompany.com/ </VirtualHost>
方式B:.htaccess配置
如果必须用.htaccess,在旧服务器的网站根目录创建/编辑.htaccess文件,内容如下:
RewriteEngine On ProxyPreserveHost On ProxyPass / http://example2.mycompany.com/ ProxyPassReverse / http://example2.mycompany.com/
二、用mod_rewrite实现(本质也是调用代理)
如果更习惯用rewrite规则,也可以这么配,效果和上面差不多:
RewriteEngine On # 只匹配旧域名的请求 RewriteCond %{HTTP_HOST} ^example1\.mycompany\.com$ # [P]标记告诉Apache用mod_proxy处理转发,[L]表示这是最后一条规则 RewriteRule ^(.*)$ http://example2.mycompany.com/$1 [P,L] # 同样要加这条处理重定向,避免URL跳转 ProxyPassReverse / http://example2.mycompany.com/
关键注意事项
- 网络连通性:要确保旧服务器能访问新服务器的80端口(如果是HTTPS的话要开443),防火墙别挡了!
- HTTPS场景适配:如果你的站点用HTTPS,还要启用
mod_ssl,旧服务器要配置好SSL证书,然后把转发地址改成https://example2.mycompany.com/,还要加上SSLProxyEngine On来支持HTTPS转发。 - 回退策略:你可以暂时保留旧服务器上的应用,万一新服务器扛不住负载,直接注释掉代理配置,重启Apache就能切回旧应用,非常方便!
- 测试验证:用
curl -v http://example1.mycompany.com测试,看响应是不是来自新服务器,同时打开浏览器访问旧域名,确认地址栏没有变成新域名。
备注:内容来源于stack exchange,提问作者draikes
相关产品推荐
相关产品推荐

