Apache ProxyPass仅对指定子域名及目录生效的配置方法
解决Apache ProxyPass仅针对特定子域名生效的问题
这是多区域子域名场景下很常见的反向代理配置需求,你之前的问题出在把ProxyPass规则放在了全局配置或者通用VirtualHost里,导致所有子域名都继承了这个规则。下面给你两种简单可靠的解决办法:
方案一:使用独立VirtualHost配置(推荐)
最清晰的方式是给每个区域子域名单独创建VirtualHost块,只在de.domain.com的配置中加入ProxyPass规则,其他子域名的配置里不添加这条规则即可:
<VirtualHost *:80> ServerName de.domain.com # 这里填写de子域名对应新站点的文档根目录等基础配置 DocumentRoot /var/www/html/new-site/de # 仅对de.domain.com生效的代理规则 ProxyPass /blog/ http://blog.olddomain.com/de/ ProxyPassReverse /blog/ http://blog.olddomain.com/de/ </VirtualHost> <VirtualHost *:80> ServerName en.domain.com # en子域名的专属配置,这里没有/blog/的代理规则,自然不会生效 DocumentRoot /var/www/html/new-site/en </VirtualHost> # 其他fr、jp等子域名的VirtualHost配置以此类推
这种方式的优势是配置隔离性强,每个子域名的规则互不干扰,后续维护和调整也更直观,非常适合你这种多区域子域名的架构。
方案二:用RewriteCond限定域名(适合共用VirtualHost的场景)
如果你的所有子域名都共用一个VirtualHost(比如通过ServerAlias *.domain.com统管),可以借助RewriteCond来精准匹配de.domain.com,再触发代理:
# 先确保启用rewrite模块 RewriteEngine On # 匹配请求的主机头为de.domain.com(NC表示不区分大小写) RewriteCond %{HTTP_HOST} ^de\.domain\.com$ [NC] # 将/blog/开头的路径转发到旧站点的对应目录,[P]表示启用反向代理,[L]表示终止后续规则匹配 RewriteRule ^/blog/(.*)$ http://blog.olddomain.com/de/$1 [P,L] # 必须添加这条规则来修正后端返回的响应头(比如Location),避免跳转错误 ProxyPassReverse /blog/ http://blog.olddomain.com/de/
额外注意事项
- 确认Apache已启用必要模块:你需要确保
mod_proxy、mod_proxy_http(方案二还要加mod_rewrite)已经启用,在Debian/Ubuntu系统可以用a2enmod proxy proxy_http rewrite命令开启,CentOS/RHEL则用httpd -M检查,缺失的话修改配置文件启用。 - 测试配置有效性:修改完配置后,用
apachectl configtest(或httpd -t)检查语法是否正确,没问题再重启Apache服务生效。
内容的提问来源于stack exchange,提问作者ForeverGolf
相关产品推荐
相关产品推荐

