Apache 2.4 multiple sites with different alias and path

13,792

Solution 1

ServerName directive should not have a /blah but only [scheme://]domain-name|ip-address[:port]. You should have something like this instead :

<VirtualHost *:80>
    DocumentRoot /var/www/
    ServerName 192.168.2.134:80
    Alias /wiki /var/www/dokuwiki
    Alias /sip /var/www/rsip/public
    <Directory /var/www/dokuwiki>
        Order deny,allow
        Allow from all
        Options FollowSymLinks
    </Directory>
    <Directory /var/www/rsip/public/>
        AllowOverride All
        Require all granted
        Options FollowSymLinks
    </Directory>
</VirtualHost>

Solution 2

It is not possible to use 2 VirtualHosts on the same Domain (in this case the IP) with different DocumentRoot. Apache would always use only one of the multiple defined VirtualHosts.

ServerName should be only name or IP. The Port is already defined in VirtauHost *:80.

You could to use one VirtualHost for your IP with var/www as DocumentRoot. The Alias is not needed, when both sites a placed under /var/www . Maybe a softlink on the filesystem is better than a Alias in Apache.

Softlinks on filesystem can be made with:

ln -s /var/www/rsip/public /var/www/sip
Share:
13,792
Daniel
Author by

Daniel

Updated on June 04, 2022

Comments

  • Daniel
    Daniel about 2 years

    I have installed Ubuntu 16.04 with apache 2.4.18 in my local network.

    I want to have two diffrent websites, identified by a /blah, there for i want to work with aliases, like:

    192.168.2.134/wiki => /var/www/dokuwiki

    192.168.2.134/sip => /var/www/rsip/public (Laravel)

    For that i have configured /etc/apache2/sites-available/dokuwiki.conf with:

    <VirtualHost *:80>
        DocumentRoot /var/www/
        ServerName 192.168.2.134:80/wiki
        Alias /wiki /var/www/dokuwiki
        <Directory /var/www/dokuwiki>
            Order deny,allow
            Allow from all
            Options FollowSymLinks
        </Directory>
    </VirtualHost>
    

    And /etc/apache2/sites-available/rsip.conf with:

    <VirtualHost *:80>
        DocumentRoot /var/www/
        ServerName 192.168.2.134:80/sip
        Alias /sip /var/www/rsip/public
        <Directory /var/www/rsip/public/>
            AllowOverride All
            Require all granted
            Options FollowSymLinks
        </Directory>
    </VirtualHost>
    

    In /etc/apache2/apache2.conf there is:

    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
    </Directory>
    
    <Directory /usr/share>
        AllowOverride None
        Require all granted
    </Directory>
    
    <Directory /var/www/>
        Options -Indexes
        Options FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
    

    I have enabled the two sites and reloaded apache2.

    Result of apachectl -S is:

    VirtualHost configuration:
    *:80                   is a NameVirtualHost
             default server 192.168.2.134 (/etc/apache2/sites-enabled/dokuwiki.conf:1)
             port 80 namevhost 192.168.2.134 (/etc/apache2/sites-enabled/dokuwiki.conf:1)
             port 80 namevhost 192.168.2.134 (/etc/apache2/sites-enabled/rsip.conf:1)
    ServerRoot: "/etc/apache2"
    Main DocumentRoot: "/var/www/html"
    Main ErrorLog: "/var/log/apache2/error.log"
    Mutex default: dir="/var/lock/apache2" mechanism=fcntl
    Mutex mpm-accept: using_defaults
    Mutex watchdog-callback: using_defaults
    Mutex rewrite-map: using_defaults
    PidFile: "/var/run/apache2/apache2.pid"
    Define: DUMP_VHOSTS
    Define: DUMP_RUN_CFG
    User: name="www-data" id=33
    Group: name="www-data" id=33
    

    Result of apachectl -M is:

    Loaded Modules:
     core_module (static)
     so_module (static)
     watchdog_module (static)
     http_module (static)
     log_config_module (static)
     logio_module (static)
     version_module (static)
     unixd_module (static)
     access_compat_module (shared)
     alias_module (shared)
     auth_basic_module (shared)
     authn_core_module (shared)
     authn_file_module (shared)
     authz_core_module (shared)
     authz_host_module (shared)
     authz_user_module (shared)
     autoindex_module (shared)
     deflate_module (shared)
     dir_module (shared)
     env_module (shared)
     filter_module (shared)
     mime_module (shared)
     mpm_prefork_module (shared)
     negotiation_module (shared)
     php7_module (shared)
     rewrite_module (shared)
     setenvif_module (shared)
     status_module (shared)
    

    The problem is, the link to 192.168.2.134/wiki works fine all the time, but the link to 192.168.2.134/sip brings up a 404 File not found and also maps to the wrong path, as i can see in /var/log/apache2/error.log:

    [Wed Jul 18 22:00:16.601623 2018] [core:info] [pid 4686] [client 192.168.2.156:25896] AH00128: File does not exist: /var/www/sip/
    

    If i try 192.168.2.134/rsip/public it works.

    I think it has to do with the sequence of virtualhosts, like seen when executing apachectl -S, like shown above..

    then if i do a2dissite dokuwiki.conf and reload apache2, the link to 192.168.2.134/sip works also fine. When i enable the 192.168.2.134/wiki again, the 192.168.2.134/sip again doesn't works.

    Is it - in general - possible to do, what i am trying to do?!

    btw: in /var/www/rsip/public/.htaccess is:

    <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
            #Options -MultiViews -Indexes
            Options -MultiViews
        </IfModule>
    
        RewriteEngine On
        RewriteBase /sip
    
        # Handle Authorization Header
        RewriteCond %{HTTP:Authorization} .
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
        # Redirect Trailing Slashes If Not A Folder...
    #    RewriteCond %{REQUEST_FILENAME} !-d
    #    RewriteCond %{REQUEST_URI} (.+)/$
    #    RewriteRule ^ %1 [L,R=301]
    
        # Redirect Trailing Slashes...
        RewriteRule ^(.*)/$ dashboard/$1 [L,R=301]
    
        # Handle Front Controller...
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.php [L]
    </IfModule>