使用 Apache ProxyPass 的反向代理重定向而不是透明地通过
Posted
技术标签:
【中文标题】使用 Apache ProxyPass 的反向代理重定向而不是透明地通过【英文标题】:Reverse Proxy with Apache ProxyPass redirects instead of transparently passing through 【发布时间】:2012-05-31 20:38:06 【问题描述】:我在 http://<server>:8080/app/portal/
的 Tomcat 中运行了一个 Web 应用程序。
我希望全世界都能通过 URL http://<server>/portal/
看到这个应用程序。
为此,我使用 Apache 2.2 设置了一个反向代理。根据documentation for ProxyPass,我希望反向代理能够透明地传递所有请求。我的浏览器不应该知道 Tomcat URL。
这是我的配置:
没有虚拟主机,我在 httpd.conf 中添加了这些行
<Location /portal/>
AllowOverride All
RewriteEngine On
ProxyPass http://server:8080/app/portal/
ProxyPassReverse http://server:8080/app/portal/
</Location>
当我使用 Firefox 打开 http://<server>/portal/
时,我得到一个 302 Moved Temporarily,所有后续呼叫都从我的浏览器直接转到 http://<server>:8080/app/portal/
。我的浏览器指向这个 URL。
这不是我对反向代理的期望。是我做错了配置还是我误解了反向代理的目的?我应该怎么做才能获得我想要的行为?
【问题讨论】:
这里的RewriteEngine On
是什么?
好问题。我从另一个我们实际进行了重写的工作配置中复制了它。我删除了它,它的行为也一样。
【参考方案1】:
我试图评论来自 davidethell 的答案,但无法正确格式化这些行,所以这是我发现的:
问题是反向代理似乎只适用于我的 Tomcat 中部署 War 的 URL,而不适用于 Tomcat 内的 servlet。这导致了 2 次重写,其中一次是反向代理,另一次只是重写后面的所有内容。
RewriteEngine On
RewriteRule ^/portal/$ /portal/portal
RewriteRule ^/portal(.+) http://<server>:8080/app$1 [P]
【讨论】:
很高兴你成功了!我已经有一段时间没有使用 Tomcat 和 Apache 进行类似的反向代理了。从长远来看,我发现 apache 连接器更加可靠。 这似乎适用于重写 URL,但我遇到了 403 禁止问题。【参考方案2】:您忘记在反向代理配置中添加以下选项:
ProxyPreserveHost On
您可以使用 Url Rewriting 实现相同的行为,但文档中不建议这样做。
【讨论】:
【参考方案3】:您是否尝试过使用 mod_rewrite 代理选项而不是 ProxyPass?比如:
RewriteRule ^$ http://server:8080/app/portal/ [P]
【讨论】:
感谢您的提示。这不是那么简单,而是正确的方向。详情见我的回答以上是关于使用 Apache ProxyPass 的反向代理重定向而不是透明地通过的主要内容,如果未能解决你的问题,请参考以下文章