how to achieve an apache Alias with a proxy pass on the same domain

We have a NodeJS site running with an Apache VirtualHost that looks like this:

<VirtualHost *:80>
    ServerName      domain.org
    ServerAlias www.domain.org

    ProxyPass / http://localhost:8884/
    ProxyPassReverse / http://localhost:8884/

    ProxyPreserveHost on

    LogLevel debug
</VirtualHost>

This works fine.

however we have now been tasked with installing a wordpress blog as an alias of the domain

www.domain.org/blog

To do this we tried setting up a vhost with an Alias like this:

<VirtualHost *:80>
       Alias /blog /var/apache-vhosts/www.domain.org-blog

       <Directory /var/apache-vhosts/www.domain.org-blog/>
           Options Indexes FollowSymLinks MultiViews
           AllowOverride All
           Order allow,deny
           allow from all
       </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

We have the mod_alias apache module enabled but it just wont pick it up.

Has anyone else achieved this?

I have also tried including the alias without a vhost wrapping tag but still no joy :/


Solution 1:

Note that ProxyPass has precedence over Alias.

To fix, declare another ProxyPass pointing to an exclamation mark (!).

For example:

<VirtualHost *:80>
    ServerName      domain.org
    ServerAlias www.domain.org
   
    # the next line is your fix
    ProxyPass /blog !
    Alias     /blog /var/apache-vhosts/www.domain.org-blog

    <Directory /var/apache-vhosts/www.domain.org-blog/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined


    ProxyPass        / http://localhost:8884/
    ProxyPassReverse / http://localhost:8884/
    ProxyPreserveHost on
    LogLevel debug
</VirtualHost>

You can find more information in the official ProxyPass documentation:

The ! directive is useful in situations where you don't want to reverse-proxy a subdirectory ― https://httpd.apache.org/docs/2.4/mod/mod_proxy.html