Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

Let's say I have the following subdomain with its own document root etc:

monad2.mysite.com

I want that all requests are proxied to an IP (for instance 193.159.3.129) but they must pass through the server at mysite.com (assuming monad2 is on this same server).

I have the following (htaccess) config which works up to the subdomain, but fails to proxy any other request...

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://193.159.3.129/$1 [P]

My problem is that while it does work for http://monad2.mysite.com/a.php (url remains the same), it doesn't work with requests like http://monad2.mysite.com/a/b (url is converted to http://193.159.3.129/a/b). Note that the latter address shows a directory listing of the proxied server, which is correct, except that the subdomain changed to an ip.

Also, I presume this system will definitely not work for HTTPS requests, correct?

Edit: After some more troubleshooting, I've found exactly when the problem is being caused. Whenever I try to access a directory without the final slash, the proxy fails, and I end up with an IP. Some example:

Original                        | Result
--------------------------------+--------------------------------
http://monad2.mysite.com        | http://monad2.mysite.com
http://monad2.mysite.com/a/     | http://monad2.mysite.com/a/
http://monad2.mysite.com/a      | http://193.159.3.129/a/           <- !
http://monad2.mysite.com/a.php  | http://monad2.mysite.com/a.php
share|improve this question
    
Do you have access to the actual Apache configuration, or just an htaccess file? –  Shane Madden Mar 17 '12 at 19:20
    
@ShaneMadden I have root access, but I kind of preferred using htaccess. I'm perfectly fine with an alternative solution though. –  Christian Mar 18 '12 at 16:50

1 Answer 1

up vote 4 down vote accepted

You need ProxyPassReverse - it catches Location fields in response headers and alters them so that the client will continue talking to the proxy, instead of the backend server.

ProxyPass and ProxyPassReverse cannot be in an .htaccess file - so replace your current rewrite rule with this, which should go inside your <VirtualHost> block for the subdomain:

ProxyPass / http://193.159.3.129/
ProxyPassReverse / http://193.159.3.129/

As an aside: do not use .htaccess when you can avoid it. Review the Apache documentation on the matter.

In general, you should only use .htaccess files when you don't have access to the main server configuration file.

share|improve this answer
    
Ah, tried that one but didn't work, probably because I tried it in the .htaccess. Regarding the 'not to use htaccess' part, though it is understandable, everyone knows that it is impractical. .htaccess are just so convenient. Heck, even I that know my own server better than anyone else will take me several minutes to find the right apache config file. That said, thanks a lot for your help...I'll reply soon when I get it working (or break everything up!) ;) –  Christian Mar 18 '12 at 18:56
1  
Sounds like you need to do a better job of naming and/or organizing your configs. –  Scott Pack Mar 18 '12 at 19:25
    
OK, it works! Thanks. –  Christian Mar 18 '12 at 19:26
    
@ScottPack Tell that to the guys creating CPanel :( –  Christian Mar 18 '12 at 19:26
2  
Add ProxyPreserveHost On to your config to have the host header sent to the PHP server, or use ProxyPassReverseCookieDomain to alter the cookie domain in the response header. –  Shane Madden Mar 18 '12 at 20:31

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.