<p>To use name-based virtual hosting, you must designate the IP
address (and possibly port) on the server that will be accepting
requests for the hosts. This is configured using the <code class="directive"><a href="../mod/core.html#namevirtualhost">NameVirtualHost</a></code> directive.
In the normal case where any and all IP addresses on the server should
be used, you can use <code>*</code> as the argument to
<code>NameVirtualHost</code>. Note that mentioning an IP address in a
<code>NameVirtualHost</code> directive does not automatically make the
server listen to that IP address. See <a href="../bind.html">Setting
which addresses and ports Apache uses</a> for more details. In addition,
any IP address specified here must be associated with a network interface
on the server.</p>
<p>The next step is to create a <code class="directive"><a href="../mod/core.html#virtualhost"><VirtualHost></a></code> block for
each different host that you would like to serve. The argument to the
<code><VirtualHost></code> directive should be the same as the
argument to the <code>NameVirtualHost</code> directive (ie, an IP
address, or <code>*</code> for all addresses). Inside each
<code><VirtualHost></code> block, you will need at minimum a
<code class="directive"><a href="../mod/core.html#servername">ServerName</a></code> directive to
designate which host is served and a <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> directive to
show where in the filesystem the content for that host lives.</p>
<div class="note"><h3>Main host goes away</h3>
If you are adding virtual hosts to an existing web server, you
must also create a <VirtualHost> block for the existing host.
The <code>ServerName</code> and <code>DocumentRoot</code> included in
this virtual host should be the same as the global
<code>ServerName</code> and <code>DocumentRoot</code>. List this
virtual host first in the configuration file so that it will act as
the default host.
</div>
<p>For example, suppose that you are serving the domain
<code>www.domain.tld</code> and you wish to add the virtual host
<code>www.otherdomain.tld</code>, which points at the same IP address.
Then you simply add the following to <code>httpd.conf</code>:</p>
<p>You can alternatively specify an explicit IP address in place of
the * in both the <code>NameVirtualHost</code> and
<code><VirtualHost></code> directives. For example, you might
want to do this in order to run some name-based virtual hosts on one
IP address, and either IP-based, or another set of name-based
virtual hosts on another address.</p>
<p>Many servers want to be accessible by more than one name. This is
possible with the <code class="directive"><a href="../mod/core.html#serveralias">ServerAlias</a></code>
directive, placed inside the <VirtualHost> section. For
example in the first <VirtualHost> block above, the <code class="directive"><a href="../mod/core.html#serveralias">ServerAlias</a></code> directive indicates that the
listed names are other names which people can use to see that same
web site:</p>
<div class="example"><p><code>
ServerAlias domain.tld *.domain.tld
</code></p></div>
<p>then requests for all hosts in the <code>domain.tld</code> domain
will be served by the <code>www.domain.tld</code> virtual host. The
wildcard characters * and ? can be used to match names. Of course,
you can't just make up names and place them in <code>ServerName</code>
or <code>ServerAlias</code>. You must first have your DNS server
properly configured to map those names to an IP address associated
with your server.</p>
<p>Finally, you can fine-tune the configuration of the virtual hosts
by placing other directives inside the
<code><VirtualHost></code> containers. Most directives can be
placed in these containers and will then change the configuration only
of the relevant virtual host. To find out if a particular directive
is allowed, check the <a href="../mod/directive-dict.html#Context">Context</a> of the
directive. Configuration directives set in the <em>main server
context</em> (outside any <code><VirtualHost></code> container)
will be used only if they are not overriden by the virtual host
settings.</p>
<p>Now when a request arrives, the server will first check if it is
using an IP address that matches the <code>NameVirtualHost</code>. If
it is, then it will look at each <code><VirtualHost></code>
section with a matching IP address and try to find one where the
<code>ServerName</code> or <code>ServerAlias</code> matches the
requested hostname. If it finds one, then it uses the configuration
for that server. If no matching virtual host is found, then
<strong>the first listed virtual host</strong> that matches the IP
address will be used.</p>
<p>As a consequence, the first listed virtual host is the
<em>default</em> virtual host. The <code>DocumentRoot</code> from the
<em>main server</em> will <strong>never</strong> be used when an IP
address matches the <code>NameVirtualHost</code> directive. If you
would like to have a special configuration for requests that do not
match any particular virtual host, simply put that configuration in a
<code><VirtualHost></code> container and list it first in the