Absolute urls not working with Apache2 AJP proxy Tomcat

I don't seem to get how to configure ReverseProxy correctly. The URLs returned are all for the root directory "/", not "/tomcat" and only the main "default" tomcat page is displayed. I use Apache2 as a frontend for Tomcat with the following Proxy rules:

ProxyPass /tomcat ajp://127.0.0.1:8009/
ProxyPassReverse /tomcat ajp://127.0.0.1:8009/

I've also tried using the ProxyName in Tomcat's AJP connector setting. Using mod_rewrite to proxy the AJP request also gave the same result.

Apache error.log gives the following line (trying to load the images from its own root):

File does not exist: /var/www/asf-logo-wide.gif, referer:

EDIT: AJP works through mod_jk, but still getting the same problem with HTTP when using subfolders.


The problem is that your tomcat server is embedding links in the HTML with the path that it knows. Not the path to your proxy server. (Garnered this from your *.gif log entry)

ProxyPassReverse does not modify links in HTML. It only modifies the HTTP headers.

In order to get this to work, you need to configure tomcat with the appropriate location and path in the app's context. Likely, you'll need to rename the webapp.war file to ROOT.war and change any context config to "/".


You might try this article, which explains the appropriate way to use ProxyPassReverse:

http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html


Since you are outputting absolute URLS there are multiple common scenarios:

Use mod_proxy_html.

Or you might use RewriteEngine to rewrite URLS in / to /myapp/.

RewriteEngine On
RewriteCond %{REQUEST_URI} ! ^/myapp/
RewriteRule ^/(.*)$ /myapp/$1

This is from memory so, you might want to verify this yourself via the mod_rewrite Documentation. But I would recommend sticking with mod_proxy_html since rewriting the links being sent out to clients would be less complex than rewriting every request internally.