使用 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://&lt;server&gt;/portal/ 时,我得到一个 302 Moved Temporarily,所有后续呼叫都从我的浏览器直接转到 http://&lt;server&gt;: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 的反向代理重定向而不是透明地通过的主要内容,如果未能解决你的问题,请参考以下文章

Apache 反向代理 Unix 套接字

Apache正向代理反向代理

从端口80到端口8000的Apache反向代理配置

apachenginx实现反向代理

如何在 Apache 中将部分 URL 传递给 ProxyPass

使用Weblogic的Apache 2.2 ProxyPass - 不能使用root