Apache 302跳转问题:如何配置rewrite将外部请求转内部地址代理到Tomcat
实现方案
可以实现该需求,你当前配置失效主要是Rewrite规则逻辑错误、缺少代理标记、未处理后端返回的跳转头三个原因导致,以下是可直接使用的临时修复配置:
核心配置代码
# 需提前确保Apache已加载mod_rewrite、mod_proxy、mod_proxy_http、mod_ssl、mod_headers模块 RewriteEngine On SSLProxyEngine On ProxyPreserveHost Off # 本地测试可关闭SSL证书校验,生产环境按需调整 SSLProxyVerify None SSLProxyCheckPeerCN Off SSLProxyCheckPeerName Off # 入站请求处理:外部域名请求内部代理转发到对应Tomcat端口 RewriteCond %{HTTP_HOST} ^external\.app-server\.com$ [NC] RewriteRule ^/app1/(.*) http://localhost:8080/app1/$1 [P,L] RewriteRule ^/openam/(.*) https://localhost:8081/openam/$1 [P,L] # 核心修复:替换后端返回跳转头中的内部域名为外部域名,避免客户端拿到未暴露的内部地址 Header edit Location ^https?://internal\.app-server\.com/(.*) https://external.app-server.com/$1 # 适配后端返回的本地端口路径跳转 ProxyPassReverse /app1 http://localhost:8080/app1/ ProxyPassReverse /openam https://localhost:8081/openam/
配置说明
- 修正了原RewriteCond的错误匹配逻辑:HTTP_HOST变量仅存储域名信息,不包含协议前缀,原规则永远不会命中
- RewriteRule增加
[P]标记,强制请求走Apache内部代理流程,不会把后端地址返回给客户端 - Header指令直接修改后端返回的302/301响应的Location头,所有内部域名的跳转都会被替换为外部域名,从根源避免客户端脱离代理
- 全程无需修改后端Tomcat、OPENAM配置,符合临时 workaround 的要求
生效注意事项
- 修改配置后执行
apachectl configtest检查语法,确认无报错后再重载Apache服务 - 如果OPENAM页面内存在硬编码的内部域名跳转,可额外添加mod_proxy_html相关配置替换页面内的内部链接,当前配置默认覆盖所有响应头跳转场景
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

