Search code examples
apacheproxypass

Redirect domain.com/path to another Apache Server


I have 3 Apache VM's running currently:

A) ProxyPass (Hosts Nothing)
B) Main Website
C) ZoneMinder Website

If you access example.com you get to the website, and can navigate around, but...

If I manually type http://example.com/zm trying to access zoneminder

It redirects http://example.com/zm in my remote browser to http://192.168.1.255:443/foo*

I can't seem to get my redirect working correctly, can anybody see what I am doing wrong?

Configs:

A) ProxyPass Server:

<VirtualHost *:80>
    ServerName          www.example.com
    RedirectPermanent / http://example.com
</VirtualHost>

<VirtualHost *:80>
ServerName example.com
ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass / http://192.168.1.255:80/
ProxyPassReverse / http://192.168.1.255:80/
<Location />
    Order allow,deny
    Allow from all
</Location>
</VirtualHost>

B) Main Website

<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/example.log
CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>

Solution

  • Got it working!

    The setup:

    Server A) Apache server that only serves proxypass and doesn't host anything

    Server B) Apache server that hosts main domain.com

    Server C) Apache server that hosts ZoneMinder @ domain.com/zm

    Server A Config:

    <VirtualHost *:80>
    ServerName domain.com
    Redirect / https://www.domain.com/
    </VirtualHost>
    
    <VirtualHost *:443>
    ServerName www.domain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    SSLProxyEngine On
    SSLProxyCheckPeerCN on
    SSLProxyCheckPeerExpire on
    SSLEngine on
    SSLCertificateFile /location of .crt
    SSLCertificateKeyFile /location of .key
    SSLCACertificateFile /location of .crt
    ProxyPreserveHost on
    
    ProxyPass /zm https://192.168.1.43:443/zm
    ProxyPassReverse /zm https://192.168.1.43:443/zm
    
    
    ProxyPass / https://192.168.1.42:443/
    ProxyPassReverse / https://192.168.1.42:443/
    
    <Location />
        Order allow,deny
        Allow from all
    </Location>
    </VirtualHost>
    

    Notes: It is important to have the /zm come before the "/" catch all. I also noticed it FAILED if i used /zm/.

    Server B Config:

    <VirtualHost *:443>
    ServerName www.domain.com
    DocumentRoot /var/www/html
    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/domain.log
    CustomLog ${APACHE_LOG_DIR}/domain.log combined
    SSLEngine on
    SSLCertificateFile /location of .crt
    SSLCertificateKeyFile /location of .key
    SSLCACertificateFile /location of .crt
    </VirtualHost>
    

    Note: it is not necessary to have *:80 redirects or Server Alias as only correctly formatted requests are sent to this server via ProxyPass filtering beforehand.

    Server C Config: (domain.com/zm)

    <VirtualHost *:443>
    ServerName www.domain.com
    DocumentRoot /var/www/html
    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/domain.log
    CustomLog ${APACHE_LOG_DIR}/domain.log combined
    SSLEngine on
    SSLCertificateFile /location of .crt
    SSLCertificateKeyFile /location of .key
    SSLCACertificateFile /location of .crt
    </VirtualHost>
    

    Yes it is the same. It works so I am happy!

    Note: All 3 servers have my SSL certs installed, but I did not touch default-ssl.conf.