11

我在 Tomcat 中运行了一个 Web 应用程序http://<server>:8080/app/portal/。我希望全世界都能通过 URL 看到这个应用程序http://<server>/portal/

为此,我使用 Apache 2.2 设置了一个反向代理。根据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。

这不是我对反向代理的期望。是我做错了配置还是我误解了反向代理的目的?我应该怎么做才能得到我想要的行为?

4

3 回答 3

5

我试图评论来自 davidethell 的答案,但无法正确格式化这些行,所以这就是我发现的:

问题是反向代理似乎只适用于在我的 Tomcat 中部署 War 的 URL,而不适用于 Tomcat 内的 servlet。这导致了 2 次重写,其中一次是反向代理,另一次只是重写后面的所有内容。

RewriteEngine On
RewriteRule   ^/portal/$ /portal/portal
RewriteRule   ^/portal(.+) http://<server>:8080/app$1 [P]
于 2012-05-31T12:03:41.160 回答
4

您忘记在反向代理配置中添加以下选项:

ProxyPreserveHost On

您可以使用 Url Rewriting 实现相同的行为,但文档中不建议这样做。

于 2014-09-08T08:48:34.340 回答
1

您是否尝试过使用 mod_rewrite 代理选项而不是 ProxyPass?就像是:

RewriteRule ^$ http://server:8080/app/portal/ [P]
于 2012-05-25T10:23:32.417 回答