penk
penk

Reputation: 41

Apache ProxyPass for URLS inconsistently failing

This one's driving me nuts. I have an active and in-use Apache proxy server serving content up on EC2. It's working great, and has a variety of vhosts that are configured like this:

<VirtualHost *:80>
    ServerName m.FOO.com
    ServerAlias customer.FOO.com

    ProxyPreserveHost On
    ProxyPass / ajp://10.211.42.48:8009/
    ProxyPassReverse / ajp://10.211.42.48:8009/

    <Proxy ajp://10.211.42.48:8009/*>
          Order allow,deny
          Allow from all
    </Proxy>
</VirtualHost>

These all work great, and I'm having no problems. Now what I'd like to do is move it so instead of a single vhost for each app, I want to have a sub-url on the main site that proxies back to the appserver. So instead of a customer having 'customer.FOO.com', they'll have 'FOO.com/customer/'

Great, sounds easy, right? Yeah, not so much. I edit the vhost entry for 'root' of the server (currently showing the landing page), and add the proxy entries to directories within that. That should do it,right? Yeah, it ain't:

<VirtualHost *:80>
    ServerName web01.aws.FOO.com
    DocumentRoot /var/www/html
    ErrorLog logs/www.FOO.com-error_log
    CustomLog logs/www.FOO.com-access_log common

    <Location /a>
            ProxyPass ajp://10.211.42.48:8009
            ProxyPassReverse ajp://10.211.42.48:8009
    </Location> 

    <Location /t>
            ProxyPass http://adm01
            ProxyPassReverse http://adm01
    </Location>

    <Proxy ajp://10.211.42.48:8009/*>
          Order allow,deny
          Allow from all
    </Proxy>

</VirtualHost>

If i hit http://www.FOO.com/t/ - I get the internal webserver - it proxies forward correctly, and all is well. If I hit http://www.FOO.com/a/ I get a 404 error. The access log even shows a 404 error.

Note that the ProxyPass AJP entries are identical to what's in the other vhost entry. So why does it work on the root on the other vhost entry, and not as a subdir here on the main vhost?

Halp!

Upvotes: 3

Views: 2707

Answers (1)

penk
penk

Reputation: 41

I ended up solving this with one particular hint I found out on a mailing list somewhere. The ProxyPassReverse directive is very touchy, and has one basic function. Anything it matches on the second argument (assuming using the ProxyPassReverse A B form) will be applied to the first argument. So it's critical to make sure the second argument is exactly the redirect that is coming from your application, or else the ProxyPassReverse directive will be ignored.

In my case, what I ended up doing was changing the Location entry to:

ProxyPass /a/ ajp://10.211.42.48:8009
ProxyPassReverse /a/ http://my.apphost.com/

And all started working just fine.

Upvotes: 1

Related Questions