【问题标题】:Reverse Proxy with Apache ProxyPass redirects instead of transparently passing through使用 Apache ProxyPass 的反向代理重定向而不是透明地通过
【发布时间】: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 是什么?
  • 好问题。我从另一个我们实际进行了重写的工作配置中复制了它。我删除了它,它的行为也一样。

标签: apache2 reverse-proxy httpd.conf proxypass


【解决方案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]
    

    【讨论】:

    • 感谢您的提示。这不是那么简单,而是正确的方向。详情见我的回答
    猜你喜欢
    • 2019-05-23
    • 2013-11-30
    • 1970-01-01
    • 2020-06-23
    • 2018-11-11
    • 2019-10-16
    • 2017-09-19
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多