3

I have searched high a low for a solution for this, and hoping it is just me. What I'm trying to do is redirect all traffic from a URL we host, to another server managed by another provider we purchase from so we can customize the root URL.

I'm using httpd 2.2.3 (Apache). This is configured in a VirtualHost section, it is also SSL (I don't think that should matter however).

Everything works great, except the exclusion.

What I have (simplified) is:

ProxyPreserveHost On <VirtualHost 1.2.3.4:443> SSLProxyEngine On ProxyPassMatch ^/$ ! ProxyPassMatch ^/(.*)$ https://proxy.example.com/$1 ProxyPassReverse / https://proxy.example.com/ SSLEngine on ... </VirtualHost> 

However it always goes to the remote site. I have tried a bunch of combinations such as:

 ProxyPassMatch /$ ! ProxyPassMatch ^/(.*)$ https://proxy.example.com/$1 
 ProxyPassMatch com/ ! ProxyPassMatch ^/(.*)$ https://proxy.example.com/$1 

I also tried going the other way (to match anything with something after the /, ie:

 ProxyPassMatch ^/(..+)$ https://proxy.example.com/$1 ProxyPassMatch / ! 
 ProxyPassMatch ^/(..*)$ https://proxy.example.com/$1 ProxyPassMatch / ! 

Now the documentation says it matches the URL, but I have found no evidence that this is what it actually does (ie: second variant above with com/).

I have also tried a bunch of other combinations which either match everything, or match nothing.

My thinking is I'm not understanding the URL that is getting given to the regular expression, but not sure how to look at it. I have turned up the debug level in Apache to debug, and it does not give anything useful either.

Cheers.

0

2 Answers 2

5

If I had to guess, I would say your problem comes from the "^/.*$" match, which will match '/'. If you dropped the explicit match to / and replaced the proxy pass with "^/.+$" is may resolve your issue. No promises though.

The difference is the * is equivalent to .{0,} while + is equivalent to .{1,}, so .* will match any or no characters, whereas you want a match on at least one.

ie: The line should read:

ProxyPassMatch ^/(.+)$ proxy.example.com/$1 
1

I figured out an answer, or more of a work around: to use another server (in this case a local server still on the same httpd instance).

ie: The lines above now read:

ProxyPassMatch ^/$ 127.0.0.1:81 ProxyPassMatch ^/(.*)$ proxy.example.com/$1 

(plus the usual host config to run on a new port, and config of a virtual host on that port). It is a bit messy, but appears to sort it out!

I'm still keen to know if I have done something wrong and there is a "correct" answer to this - as I consider this a bit of a hack.

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.