Question

I got a web application running inside a Tomcat at http://<server>:8080/app/portal/. I want the world to see this application through the URL http://<server>/portal/.

To do this, I set up a Reverse Proxy with Apache 2.2. According to the documentation for ProxyPass I expect the reverse proxy to pass all requests through transparently. My browser should never know about the Tomcat URL.

Here is my configuration:

No virtual hosts, I added these lines to my httpd.conf

<Location /portal/>
    AllowOverride All
    RewriteEngine On
    ProxyPass  http://server:8080/app/portal/
    ProxyPassReverse http://server:8080/app/portal/
 </Location>

When I use Firefox to open http://<server>/portal/, I get a 302 Moved Temporarily, and all follow-up calls go from my browser directly to http://<server>:8080/app/portal/. My browser points to this URL.

This is not what I expected of a Reverse Proxy. Did I do the configuration wrong or did I misunderstand the purpose of Reverse Proxies? What should I do to get my desired behavior?

Was it helpful?

Solution

I tried to comment the answer from davidethell, but could not get the lines correctly formatted, so here is what I found out:

The problem was that the reverse proxy seems only to work to the URL where the War is deployed in my Tomcat, and NOT to the servlet inside the Tomcat. This leads to 2 rewrites, one of them the reverse proxy and one just rewriting everything behind that.

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

OTHER TIPS

You forgot to add the following option in your reverse proxy configuration:

ProxyPreserveHost On

You can achieve the same behavior with Url Rewriting but it's not recommended in the documentation.

Have you tried using the mod_rewrite Proxy option instead of ProxyPass? Something like:

RewriteRule ^$ http://server:8080/app/portal/ [P]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top