name-based.html revision 25503838e438bb909e3ff880125732c7ed5e64ad
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML><HEAD>
<TITLE>Apache name-based Virtual Hosts</TITLE>
</HEAD>
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
<BODY
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#000080"
ALINK="#FF0000"
>
<!--#include virtual="header.html" -->
<H1 ALIGN="CENTER">Apache name-based Virtual Host Support</H1>
<STRONG>See Also:</STRONG>
<HR>
<H2>Name-based vs. IP-based virtual hosts</H2>
<P>While the approach with IP-based virtual hosts works very well,
it is not the most elegant solution, because a dedicated IP address
is needed for every virtual host and it is hard to implement on some
server to identify what name it is being addressed as. Apache 1.1 and
later support this approach as well as the traditional
IP-address-per-hostname method.</P>
<P>The benefits of using the new name-based virtual host support is a
practically unlimited number of servers, ease of configuration and use, and
requires no additional hardware or software.
The main disadvantage is that the client must support this part of the
protocol. The latest versions of most browsers do, but there are still
old browsers in use who do not. This can cause problems, although a possible
solution is addressed below.</P>
<H2>Using non-IP Virtual Hosts</H2>
<P>Using the new virtual hosts is quite easy, and superficially looks
like the old method. You simply add to one of the Apache configuration
code similar to the following:</P>
<PRE>
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.domain.tld
</VirtualHost>
</PRE>
<P>The notable difference between IP-based and name-based virtual host
configuration is the
directive which specifies an IP address that should be used as a target for
name-based virtual hosts.
<P>Of course, any additional directives can (and should) be placed
into the <CODE><VirtualHost></CODE> section. To make this work,
all that is needed is to make sure that the name
<SAMP>111.22.33.44</SAMP></P>
<P>Additionally, many servers may wish to be accessible by more than
one name. For example, the example server might want to be accessible
the IP addresses pointed to the same server. In fact, one might want it
server. This is possible with the
directive, placed inside the <VirtualHost> section. For
example:</P>
<PRE>
ServerAlias domain.tld *.domain.tld
</PRE>
<P>Note that you can use <CODE>*</CODE> and <CODE>?</CODE> as wild-card
characters.</P>
<P>You also might need <CODE>ServerAlias</CODE> if you are
serving local users who do not always include the domain name.
For example, if local users are
familiar with typing "www" or "www.foobar" then you will need to add
server to know what domain the client uses for their name resolution
because the client doesn't provide that information in the request.</P>
<H2>Compatibility with Older Browsers</H2>
<P>As mentioned earlier, there are still some clients in use who
do not send the required data for the name-based virtual hosts to work
properly. These clients will always be sent the pages from the
<CITE>primary</CITE> name-based virtual host (the first virtual host
appearing in the configuration file for a specific IP address).</P>
<P>There is a possible workaround with the
directive, albeit a slightly cumbersome one:</P>
<P>Example configuration:
<PRE>
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.domain.tld
ServerPath /domain
</VirtualHost>
</PRE>
<P>What does this mean? It means that a request for any URI beginning
with "<SAMP>/domain</SAMP>" will be served from the virtual host
clients sending a <SAMP>Host:</SAMP> header can also access it as
<P>In order to make this work, put a link on your primary virtual host's page
Then, in the virtual host's pages, be sure to use either purely
<SAMP>/domain/</SAMP>
<P>This requires a bit of
discipline, but adherence to these guidelines will, for the most part,
ensure that your pages will work with all browsers, new and old.</P>
example</A></P>
<!--#include virtual="footer.html" -->
</BODY>
</HTML>