Setting up Virtual Hosts

Updated on 28 Dec 2018

Setting up virtual hosts in Apache is a fairly straight forward process, and these steps will help you get there.

Add the domain to the hosts file

/etc/hosts

An example of my hosts file is shown below.

127.0.0.1	localhost
127.0.0.1	application
127.0.0.1	yii

Create a new site file

In /etc/apache2/sites-available, create a new file with the same name as your host. I.e. yii.conf.

<VirtualHost *:80>
    ServerAdmin admin@localhost
    DocumentRoot "/var/www/yii"
    ServerName yii
    ErrorLog "/var/log/apache2/yii-error.log"
    CustomLog "/var/log/apache2/yii-access.log" common
	
    <Directory "/var/www/yii">
        Require all granted
    </Directory>

</VirtualHost>

At a minimum you might want to set up the following parameters.

Parameter Meaning
ServerAlias the email address for the server admin
DocumentRoot Typically the location of where your web pages are located
ServerName This will match one of the names in the hosts file
ErrorLog Where the log messages are written to
CustomLog Where normal access messages are written to

There are many more configuration options available, so by all means check them out here.

Set up the directory tag

You also need to set up the directory tag within your VirtualHost and specify how the directory can be accessed, and what privileges are available. At a basic level, it could look like this

<Directory "/var/www/yii">
    Require all granted
</Directory>

But we can over-ride many of the settings for individual directories if we want, i.e. log files, access etc. For a simple file, index.html, placed in the the /var/www/yii directory, I can expect an output similar to what is shown below.

ifModule dir_module

Various Apache modules provide additional functionality to the core http webserver. One of these is mod_dir which provides a DirectoryIndex directive which instructs Apache what to do when a client requests a directory without the file.

In the previous example I requested the file directly. http://yii/index.html. If I omit the filename and only request the directory http://yii, then I will get a directory listing of all the files and directories available.

turn off indexes

Inside your directory settings, you can remove this behaviour using the options directive.

<Directory "/var/www/yii">
    Options -Indexes
    Require all granted
</Directory>

In which case you end up with 404 page not found.

Or a forbidden message if you have autoindex enabled.

[Thu Jan 23 15:52:17.917514 2020] [autoindex:error] [pid 8771] [client 127.0.0.1:48006] AH01276: Cannot serve directory /var/www/yii/: 
No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory 
index forbidden by Options directive

There are many options you can set/turn off.

Enable mod_dir

Enabling mod_dir is done with the following command.

sudo a2enmod dir

In the /etc/apache2/mods-enabled we will see 2 files.

file purpose
dir.load Contains the command to the load the directory modules
dir.conf Contains the default configuration settings for the module

If we look inside the dir.conf file, we’ll see this.

What this means is that whenever a client requests a directory (no file), Apache will search for index.html, followed by index.cgi, index.pl etc. If Apache finds the file, it will automatically load it; and we can see an example of that below.

You can modify the dir.conf to provide additional files for the DirectoryIndex directive, or you can over-ride the default settings in the virtual hosts file.