使用Apache ProxyPass反向代理时出现重定向而非透明传递的情况

12

我有一个运行在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临时移动的响应,并且所有后续的调用都直接从我的浏览器发送到http://<server>:8080/app/portal/。 我的浏览器指向这个URL。
这不是我对反向代理的期望。 我是配置错误还是误解了反向代理的目的?我该如何才能获得我想要的行为?

这里的RewriteEngine On是用来做什么的? - s.webbandit
1
好问题。我将其从另一个正常工作的配置中复制过来,那里实际上有重写。我将其删除后,它的行为仍然相同。 - Matthias Kempka
4个回答

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

您可以使用URL重写来实现相同的行为,但在文档中不推荐这样做。

5

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

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

RewriteEngine On
RewriteRule   ^/portal/$ /portal/portal
RewriteRule   ^/portal(.+) http://<server>:8080/app$1 [P]

很高兴你解决了它!我已经有一段时间没有使用Tomcat和Apache进行类似的反向代理了。我发现Apache连接器在长期运行中更加可靠。 - davidethell
1
似乎这个可以重写URL,但我遇到了403禁止访问的问题。 - ThemeZ

1

你尝试过使用mod_rewrite代理选项而不是ProxyPass吗?类似这样:

RewriteRule ^$ http://server:8080/app/portal/ [P]

谢谢你的提示。事情并不像那么简单,但是你指导了我正确的方向。请看下面的答案以获取详细信息。 - Matthias Kempka

0

对于我的 https 服务器,我使用了:

SSLProxyEngine on
ProxyPass / https://server:7000/
ProxyPassReverse / https://server:7000/
ProxyPreserveHost On

SSLProxyEngine 管理着真实服务器(在我这里是7000端口)的https行为。其他的只是管理重定向而不改变URL。

现在,在浏览器中,我可以访问https://server/,实际上是访问了https://server:7000/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接