Mailing List Archive

cvs commit: apachen/htdocs/manual/vhosts details.html details_1_2.html examples.html fd-limits.html footer.html header.html index.html ip-based.html name-based.html
martin 97/11/11 15:47:22

Modified: htdocs/manual bind.html dns-caveats.html index.html
new_features_1_0.html new_features_1_1.html
new_features_1_3.html upgrading_to_1_3.html
htdocs/manual/misc FAQ.html known_bugs.html
htdocs/manual/mod core.html
Added: htdocs/manual/vhosts details.html details_1_2.html
examples.html fd-limits.html footer.html
header.html index.html ip-based.html
name-based.html
Log:
Citing Lars:
Hi,

the attachment includes a reworked Apache manual with the
new virtual host documentation.

As Dean suggested I created a new directory named 'vhosts' and moved the
updated vhosts-in-depth etc. documents into the new directory, renamed
them and updated all other documents which refered to the old docs
(at least I tried to find all documents...).

Submitted by: Lars Eilebrecht <sfx@unix-ag.org>
Reviewed by: Martin Kraemer

Revision Changes Path
1.9 +1 -2 apachen/htdocs/manual/bind.html

Index: bind.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/bind.html,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -u -r1.8 -r1.9
--- bind.html 1997/06/04 11:07:47 1.8
+++ bind.html 1997/11/11 23:46:47 1.9
@@ -95,8 +95,7 @@
<h2>See also</h2>

See also the documentation on
-<a href="virtual-host.html">Virtual Hosts</a>,
-<a href="host.html">Non-IP virtual hosts</a>,
+<a href="vhosts/index.html">Virtual Hosts</a>,
<a href="mod/core.html#bindaddress">BindAddress directive</a>,
<a href="mod/core.html#port">Port directive</a>,
<a href="dns-caveats.html">DNS Issues</a>



1.7 +2 -14 apachen/htdocs/manual/dns-caveats.html

Index: dns-caveats.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/dns-caveats.html,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -u -r1.6 -r1.7
--- dns-caveats.html 1997/07/06 17:18:53 1.6
+++ dns-caveats.html 1997/11/11 23:46:48 1.7
@@ -113,11 +113,11 @@
served by the <code>def.com</code> virtual host. To better understand why
this happens requires a more in-depth discussion of how Apache matches
up incoming requests with the virtual host that will serve it. A rough
-document describing this <a href="vhosts-in-depth.html"> is available</a>.
+document describing this <a href="vhosts/details.html"> is available</a>.

<h3>The "main server" Address</h3>

-<p>The addition of <a href="host.html">non-IP-based virtual host
+<p>The addition of <a href="vhosts/name-based.html">name-based virtual host
support</a> in Apache 1.1 requires Apache to know the IP address(es) of
the host that httpd is running on. To get this address it uses either
the global <code>ServerName</code> (if present) or calls the C function
@@ -140,18 +140,6 @@
CGIs unless you use <a href="mod/mod_env.html"><code>mod_env</code></a>
to control the environment. It's best to consult the man pages or FAQs
for your OS.
-
-<h3>The _default_ Address</h3>
-
-<p>Any address that happens to go to your webserver which doesn't match
-the IP address of any of the webservers will be served from the "main" or
-"default" server configurations. The "main" server configuration consists
-of all those definitions appearing outside of any VirtualHost section.
-You may want instead to define a <code>&lt;VirtualHost _default_:*&gt;</code>
-which returns 403 or 404 for all hits. (The trailing <code>:*</code>
-makes it apply to all ports, which is just a safety measure should you
-begin using multiple <code><a href="mod/core.html#listen">Listen</a></code>
-directives.)

<h3><a name="tips">Tips to Avoid these problems</a></h3>




1.19 +2 -1 apachen/htdocs/manual/index.html

Index: index.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/index.html,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -u -r1.18 -r1.19
--- index.html 1997/10/24 09:53:39 1.18
+++ index.html 1997/11/11 23:46:48 1.19
@@ -44,7 +44,8 @@
<li><A HREF="invoking.html">Starting Apache</A>
<li><A HREF="stopping.html">Stopping or Restarting Apache</A>
<li><A HREF="mod/directives.html">Apache run-time configuration directives</A>
-<li><A HREF="mod/">Apache modules</A>
+<li><A HREF="mod/index.html">Apache modules</A>
+<li><A HREF="vhosts/index.html">Apache Virtual Host documentation</A>
<li><A HREF="handler.html">Apache's handler use</A>
<li><A HREF="env.html">Special purpose environment variables</A>
<LI><A HREF="misc/API.html">Highly generalized API to server functionality</A>



1.8 +1 -1 apachen/htdocs/manual/new_features_1_0.html

Index: new_features_1_0.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/new_features_1_0.html,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -u -r1.7 -r1.8
--- new_features_1_0.html 1997/07/06 17:18:55 1.7
+++ new_features_1_0.html 1997/11/11 23:46:49 1.8
@@ -58,7 +58,7 @@

<P>

-<LI> <a href="virtual-host.html">&lt;VirtualHost&gt; (the configuration directive for
+<LI> <a href="vhosts/index.html">&lt;VirtualHost&gt; (the configuration directive for
multiple-homed servers)</a> is more general now. Just about any srm.conf or
httpd.conf command can go in a &lt;Virtualhost&gt; section, with the
following specific exceptions: ServerType, UserId, GroupId,



1.9 +1 -1 apachen/htdocs/manual/new_features_1_1.html

Index: new_features_1_1.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/new_features_1_1.html,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -u -r1.8 -r1.9
--- new_features_1_1.html 1997/07/06 14:54:44 1.8
+++ new_features_1_1.html 1997/11/11 23:46:49 1.9
@@ -47,7 +47,7 @@
Netscape Navigator 2.0) has been shown to increase speed of document
transfer by up to 50% in certain cases.

-<li><b><a href="host.html">New non-IP Intensive VirtualHost
+<li><b><a href="vhosts/index.html">New non-IP Intensive VirtualHost
Support</a></b><br>
Apache's support for virtual hosts has been enhanced to be able to
use information sent by some new Web browsers to determine the server



1.31 +3 -1 apachen/htdocs/manual/new_features_1_3.html

Index: new_features_1_3.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/new_features_1_3.html,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -u -r1.30 -r1.31
--- new_features_1_3.html 1997/11/09 20:40:28 1.30
+++ new_features_1_3.html 1997/11/11 23:46:50 1.31
@@ -341,7 +341,7 @@
it easier to start Apache via rsh or crontab.

<li><strong>Improved HTTP/1.1-style Virtual Hosts</strong><br>
- The new (undocumented)
+ The new
<a href="mod/core.html#namevirtualhost"><SAMP>NameVirtualHost</SAMP></a>
directive is used to list IP address:port
pairs on which HTTP/1.1-style virtual hosting occurs. This is
@@ -349,6 +349,8 @@
Previously this address was implicitly the same as the "main address"
of the machine, and this caused no end of problems for users, and
was not powerful enough.
+ Please see the <a href="vhosts/index.html">Apache Virtual Host
+ documentation</a> for further details on configuration.

<li><strong>API Additions</strong><br>




1.4 +3 -1 apachen/htdocs/manual/upgrading_to_1_3.html

Index: upgrading_to_1_3.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/upgrading_to_1_3.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -u -r1.3 -r1.4
--- upgrading_to_1_3.html 1997/10/07 23:01:35 1.3
+++ upgrading_to_1_3.html 1997/11/11 23:46:50 1.4
@@ -65,10 +65,12 @@
<ul>
<li>Folks using HTTP/1.1-style virtual hosting will need to list the
ip:port pairs that are supposed to have HTTP/1.1-style virtual hosting
- via the (undocumented) <a href="mod/core.html#namevirtualhost"><code>
+ via the <a href="mod/core.html#namevirtualhost"><code>
NameVirtualHost</code></a> directive. Previously this support was
given implicitly on the "main server address". Now it has to be
explicitly listed so as to avoid many problems that users had.
+ Please see the <a href="vhosts/index.html">Apache Virtual Host
+ documentation</a> for further details on configuration.

<li>The precedence of virtual hosts has been reversed (applies mainly to
vhosts using HTTP/1.1 Host: headers, and the



1.94 +12 -4 apachen/htdocs/manual/misc/FAQ.html

Index: FAQ.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/misc/FAQ.html,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -u -r1.93 -r1.94
--- FAQ.html 1997/11/06 14:52:47 1.93
+++ FAQ.html 1997/11/11 23:47:15 1.94
@@ -15,7 +15,7 @@
<!--#include virtual="header.html" -->
<H1 ALIGN="CENTER">Apache Server Frequently Asked Questions</H1>
<P>
- $Revision: 1.93 $ ($Date: 1997/11/06 14:52:47 $)
+ $Revision: 1.94 $ ($Date: 1997/11/11 23:47:15 $)
</P>
<P>
The latest version of this FAQ is always available from the main
@@ -254,7 +254,7 @@
</LI>
<LI><A HREF="#year2000">Is Apache Year 2000 compliant?</A>
</LI>
- <LI><A HREF="#namevhost">I upgraded to Apache 1.3b2 and now my
+ <LI><A HREF="#namevhost">I upgraded to Apache 1.3b and now my
virtual hosts don't work!</A>
</LI>
</OL>
@@ -420,7 +420,10 @@
REL="Help"
><CITE>Apache Week</CITE></A>
available. Links to relevant <CITE>Apache Week</CITE> articles are
- included below where appropriate.
+ included below where appropriate. There are also some
+ <A
+ HREF="http://www.apache.org/info/apache_books.html"
+ >Apache-specific books</A> available.
</P>
<HR>
</LI>
@@ -2111,7 +2114,7 @@
<HR>
</LI>
<LI><A NAME="namevhost">
- <STRONG>I upgraded to Apache 1.3b2 and now my virtual hosts don't
+ <STRONG>I upgraded to Apache 1.3b and now my virtual hosts don't
work!</STRONG>
</A>
<P>
@@ -2149,6 +2152,11 @@
Make sure that your name-based <SAMP>&lt;VirtualHost&gt;</SAMP> blocks
contain <SAMP>ServerName</SAMP> and possibly <SAMP>ServerAlias</SAMP>
directives so Apache can be sure to tell them apart correctly.
+ </P>
+ <P>
+ Please see the
+ <A HREF="http://www.apache.org/docs/vhosts/index.html">Apache
+ Virtual Host documentation</A> for further details about configuration.
</P>
<HR>
</LI>



1.35 +1 -10 apachen/htdocs/manual/misc/known_bugs.html

Index: known_bugs.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/misc/known_bugs.html,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -u -r1.34 -r1.35
--- known_bugs.html 1997/11/11 23:11:10 1.34
+++ known_bugs.html 1997/11/11 23:47:15 1.35
@@ -35,16 +35,7 @@
<HR>

<H2>Apache 1.3b2 Bugs</H2>
-<OL>
-<LI>There is no documentation for the <CODE>NameVirtualHost</CODE>
- directive. Name based virtual hosts (ie. those that do not have
- a separate IP) will not work unless you add a
- <CODE>NameVirtualHost x.x.x.x</CODE> directive to your config file
- for each IP address you want name based virtual hosts to be used
- on, where <CODE>x.x.x.x</CODE> is the IP address. This must appear
- before the related <A HREF="../mod/core.html#virtualhost">VirtualHost</A>
- directive. Documentation is being written for this.
-</OL>
+
<H3>Win32 only</H3>
<OL>
<LI>CGI scripts that are called with information appended to the script



1.83 +41 -14 apachen/htdocs/manual/mod/core.html

Index: core.html
===================================================================
RCS file: /home/cvs/apachen/htdocs/manual/mod/core.html,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -u -r1.82 -r1.83
--- core.html 1997/11/11 23:11:11 1.82
+++ core.html 1997/11/11 23:47:17 1.83
@@ -57,6 +57,7 @@
<li><A HREF="#maxrequestsperchild">MaxRequestsPerChild</A>
<li><A HREF="#maxspareservers">MaxSpareServers</A>
<li><A HREF="#minspareservers">MinSpareServers</A>
+<li><A HREF="#namevirtualhost">NameVirtualHost</A>
<li><A HREF="#options">Options</A>
<li><A HREF="#pidfile">PidFile</A>
<li><A HREF="#port">Port</A>
@@ -252,7 +253,7 @@
<code>BindAddress</code>.<p>

<code>BindAddress</code> can be used as an alternative method for
-supporting <A HREF="../virtual-host.html">virtual hosts</A> using
+supporting <A HREF="../vhosts/index.html">virtual hosts</A> using
multiple independent servers, instead of using <code><A
HREF="#virtualhost">&lt;VirtualHost&gt;</A></code> sections.

@@ -1111,6 +1112,34 @@
See also <A HREF="#maxspareservers">MaxSpareServers</A> and
<A HREF="#startservers">StartServers</A>.<p><hr>

+<h2><A name="namevirtualhost">NameVirtualHost directive</A></h2>
+<!--%plaintext &lt;?INDEX {\tt NameVirtualHost} directive&gt; -->
+<strong>Syntax:</strong> NameVirtualHost <em>addr</em>[:<em>port</em>]<br>
+<strong>Context:</strong> server config<br>
+<strong>Status:</strong> core<p>
+<strong>Compatibility:</strong> NameVirtualHost is only available in Apache 1.3 and later<p>
+
+The NameVirtualHost directive is a required directive if you want to configure
+<A HREF="../vhosts/index.html">name-based virtual hosts</A>.<p>
+
+Although <em>addr</em> can be hostname it is recommended that you always use
+an IP address, e.g.
+
+<blockquote><code>NameVirtualHost 111.22.33.44</code></blockquote>
+
+With the NameVirtualHost directive the address to which your name-based
+virtual host names resolve.
+If you have multiple name-based hosts on multiple addresses,
+repeat the directive for each address.<p>
+
+Optionally you can specify a port number on which the name-based
+virtual hosts should be used, e.g.
+
+<blockquote><code>NameVirtualHost 111.22.33.44:8080</code></blockquote>
+
+<strong>See also:</strong>
+<a href="../vhosts/index.html">Apache Virtual Host documentation</a>
+
<h2><A name="options">Options directive</A></h2>
<!--%plaintext &lt;?INDEX {\tt Options} directive&gt; -->
<strong>Syntax:</strong> Options <em>[+|-]option [+|-]option ...</em><br>
@@ -1490,9 +1519,10 @@

The ServerAlias directive sets the alternate names for a host, for use
with
-<a href="../host.html">Host-header based virtual hosts</a>.
-<p><strong>See Also</strong>:
-<a href="../vhosts-in-depth.html">In-depth description of Virtual Host matching</a></p>
+<a href="../vhosts/name-based.html">name-based virtual hosts</a>.
+
+<p><strong>See also:</strong>
+<a href="../vhosts/index.html">Apache Virtual Host documentation</a>

<hr>

@@ -1522,9 +1552,11 @@
1.1 and later.<p>

The ServerPath directive sets the legacy URL pathname for a host, for
-use with <a href="../host.html">Host-header based virtual hosts</a>.
-<p><strong>See Also</strong>:
-<a href="../vhosts-in-depth.html">In-depth description of Virtual Host matching</a></p>
+use with <a href="../vhosts/index.html">name-based virtual hosts</a>.
+
+<p><strong>See also:</strong>
+<a href="../vhosts/index.html">Apache Virtual Host documentation</a>
+
<hr>

<h2><A name="serverroot">ServerRoot directive</A></h2>
@@ -1742,14 +1774,9 @@
href="#listen">Listen</a>.

<p><strong>See also:</strong>
-<A HREF="../dns-caveats.html">Warnings about DNS and Apache</a><br>
-<strong>See also:</strong>
-<A HREF="../virtual-host.html">Information on Virtual Hosts.
-(multihome)</A><br>
+<a href="../vhosts/index.html">Apache Virtual Host documentation</a><br>
<strong>See also:</strong>
-<a href="../host.html">Non-IP address-based Virtual Hosts</a><br>
-<strong>See also:</strong>
-<a href="../vhosts-in-depth.html">In-depth description of Virtual Host matching</a><br>
+<A HREF="../dns-caveats.html">Warnings about DNS and Apache</a><br>
<strong>See also:</strong>
<a href="../bind.html">Setting which addresses and ports Apache uses</a><br>
<strong>See also</strong>: <a href="../sections.html">How Directory,



1.1 apachen/htdocs/manual/vhosts/details.html

Index: details.html
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html><head>
<title>An In-Depth Discussion of Virtual Host Matching</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">An In-Depth Discussion of Virtual Host Matching</h1>

<p>The virtual host code was completely rewritten in <B>Apache 1.3</B>.
This document attempts to explain exactly what Apache does when
deciding what virtual host to serve a hit from. With the help of the
new <A HREF="../mod/core.html#namevirtualhost"><SAMP>NameVirtualHost</SAMP></A>
directive virtual host configuration should be a lot easier and safer
than with versions prior to 1.3.

<p>If you just want to <cite>make it work</cite> without understanding
how, here are <a href="examples.html">some examples</a>.

<h3>Config File Parsing</h3>

<p>There is a <EM>main_server</EM> which consists of all
the definitions appearing outside of <CODE>&lt;VirtualHost&gt;</CODE> sections.
There are virtual servers, called <EM>vhosts</EM>, which are defined by
<A HREF="../mod/core.html#virtualhost"><SAMP>&lt;VirtualHost&gt;</SAMP></A>
sections.

<p>The directives
<A HREF="../mod/core.html#port"><SAMP>Port</SAMP></A>,
<A HREF="../mod/core.html#servername"><SAMP>ServerName</SAMP></A>,
<A HREF="../mod/core.html#serverpath"><SAMP>ServerPath</SAMP></A>,
and
<A HREF="../mod/core.html#serveralias"><SAMP>ServerAlias</SAMP></A>
can appear anywhere within the definition of
a server. However, each appearance overrides the previous appearance
(within that server).

<p>The default value of the <code>Port</code> field for main_server
is 80. The main_server has no default <code>ServerPath</code>, or
<code>ServerAlias</code>. The default <code>ServerName</code> is
deduced from the servers IP address.

<p>The main_server Port directive has two functions due to legacy
compatibility with NCSA configuration files. One function is
to determine the default network port Apache will bind to. This
default is overridden by the existence of any
<A HREF="../mod/core.html#listen"><code>Listen</code></A> directives.
The second function is to specify the port number which is used
in absolute URIs during redirects.

<p>Unlike the main_server, vhost ports <em>do not</em> affect what
ports Apache listens for connections on.

<p>Each address appearing in the <code>VirtualHost</code> directive
can have an optional port. If the port is unspecified it defaults to
the value of the main_server's most recent <code>Port</code> statement.
The special port <SAMP>*</SAMP> indicates a wildcard that matches any port.
Collectively the entire set of addresses (including multiple
<SAMP>A</SAMP> record
results from DNS lookups) are called the vhost's <EM>address set</EM>.

<P>Unless a <A HREF="../mod/core.html#namevirtualhost">NameVirtualHost</A>
directive is used for a specific IP address the first vhost with
that address is treated as an IP-based vhost.

<P>If name-based vhosts should be used a <code>NameVirtualHost</code>
directive <em>must</em> appear with the IP address set to be used for the
name-based vhosts. In other words, you must specify the IP address that
holds the hostname aliases (CNAMEs) for your name-based vhosts via a
<code>NameVirtualHost</code> directive in your configuration file.

<P>Multiple <code>NameVirtualHost</code> directives can be used each
with a set of <code>VirtualHost</code> directives.

<P>The ordering of <code>NameVirtualHost</code> and
<code>VirtualHost</code> directives is not important which makes the
following two examples identical (only the order of the
<code>VirtualHost</code> directives for <em>one</em> address set
is important, see below):

<pre>
|
NameVirtualHost 111.22.33.44 | &lt;VirtualHost 111.22.33.44&gt;
&lt;VirtualHost 111.22.33.44&gt; | # server A
# server A | &lt;/VirtualHost&gt;
... | &lt;VirtualHost 111.22.33.55&gt;
&lt;/VirtualHost&gt; | # server C
&lt;VirtualHost 111.22.33.44&gt; | ...
# server B | &lt;/VirtualHost&gt;
... | &lt;VirtualHost 111.22.33.44&gt;
&lt;/VirtualHost&gt; | # server B
| ...
NameVirtualHost 111.22.33.55 | &lt;/VirtualHost&gt;
&lt;VirtualHost 111.22.33.55&gt; | &lt;VirtualHost 111.22.33.55&gt;
# server C | # server D
... | ...
&lt;/VirtualHost&gt; | &lt;/VirtualHost&gt;
&lt;VirtualHost 111.22.33.55&gt; |
# server D | NameVirtualHost 111.22.33.44
... | NameVirtualHost 111.22.33.55
&lt;/VirtualHost&gt; |
|
</pre>

<p>(To aid the readability of your configuration you should prefer the
left variant.)

<p> After parsing the <code>VirtualHost</code> directive, the vhost server
is given a default <code>Port</code> equal to the port assigned to the
first name in its <code>VirtualHost</code> directive.

<p>The complete list of names in the <code>VirtualHost</code> directive
are treated just like a <code>ServerAlias</code> (but are not overridden by any
<code>ServerAlias</code> statement) if all names resolve to the same address set.
Note that subsequent <code>Port</code> statements for this vhost will not affect
the ports assigned in the address set.

<p>During initialization a list for each IP address
is generated an inserted into an hash table. If the IP address is
used in a <code>NameVirtualHost</code> directive the list contains
all name-based vhosts for the given IP address. If there are no
vhosts defined for that address the <code>NameVirtualHost</code> directive
is ignored and an error is logged. For an IP-based vhost the list in the
hash table is empty.

<p>Due to a fast hashing function the overhead of hashing an IP address
during a request is minimal and almost not existent. Additionally
the table is optimized for IP addresses which vary in the last octet.

<p>For every vhost various default values are set. In particular:

<ol>
<li>If a vhost has no
<A HREF="../mod/core.html#serveradmin"><code>ServerAdmin</code></A>,
<A HREF="../mod/core.html#resourceconfig"><code>ResourceConfig</code></A>,
<A HREF="../mod/core.html#accessconfig"><code>AccessConfig</code></A>,
<A HREF="../mod/core.html#timeout"><code>Timeout</code></A>,
<A HREF="../mod/core.html#keepalivetimeout"><code>KeepAliveTimeout</code></A>,
<A HREF="../mod/core.html#keepalive"><code>KeepAlive</code></A>,
<A HREF="../mod/core.html#maxkeepaliverequests"><code>MaxKeepAliveRequests</code></A>,
or
<A HREF="../mod/core.html#sendbuffersize"><code>SendBufferSize</code></A>
directive then the respective value is
inherited from the main_server. (That is, inherited from whatever
the final setting of that value is in the main_server.)

<li>The &quot;lookup defaults&quot; that define the default directory
permissions
for a vhost are merged with those of the main_server. This includes
any per-directory configuration information for any module.

<li>The per-server configs for each module from the main_server are
merged into the vhost server.
</ol>

Essentially, the main_server is treated as &quot;defaults&quot; or a
&quot;base&quot; on which to build each vhost.
But the positioning of these main_server
definitions in the config file is largely irrelevant -- the entire
config of the main_server has been parsed when this final merging occurs.
So even if a main_server definition appears after a vhost definition
it might affect the vhost definition.

<p> If the main_server has no <code>ServerName</code> at this point,
then the hostname of the machine that httpd is running on is used
instead. We will call the <EM>main_server address set</EM> those IP
addresses returned by a DNS lookup on the <code>ServerName</code> of
the main_server.

<p> For any undefined <code>ServerName</code> fields, a name-based vhost
defaults to the address given first in the <code>VirtualHost</code>
statement defining the vhost.

<P>Any vhost that includes the magic <SAMP>_default_</SAMP> wildcard
is given the same <code>ServerName</code> as the main_server.


<h3>Virtual Host Matching</h3>

<p>The server determines which vhost to use for a request as follows:

<h4>Hash table lookup</h4>

<p>When the connection is first made by a client, the IP address to
which the client connected is looked up in the internal IP hash table.

<P>If the lookup fails (the IP address wasn't found) the request is
served from the <samp>_default_</samp> vhost if there is such a vhost
for the port to which the client sent the request. If there is no
matching <samp>_default_</samp> vhost the request is served from the
main_server.

<P>If the lookup succeeded (a corresponding list for the IP address was
found) the next step is to decide if we have to deal with an IP-based
or a name-base vhost.

<h4>IP-based vhost</h4>

<P>If the entry we found has an empty name list then we have found an
IP-based vhost, no further actions are performed and the request is
served from that vhost.

<h4>Name-based vhost</h4>

<p>If the entry corresponds to a name-based vhost the name list contains
one or more vhost structures. This list contains the vhosts in the same
order as the <code>VirtualHost</code> directives appear in the config
file.

<p>The first vhost on this list (the first vhost that appears after the
corresponding <code>NameVirtualHost</code> directive in the config file)
has the highest priority and catches any request to an unknown
server name or a request without a <code>Host:</code> header.

<p>If the client provided a <code>Host:</code> header the list is
searched for a matching vhost and the first hit on a <code>ServerName</code>
or <code>ServerAlias</code> is taken and the request is served from
that vhost. A <code>Host:</code> header can contain a port number, but
Apache always matches against the real port to which the client sent
the request.

<p>If the client submitted a HTTP/1.0 request without <code>Host:</code>
header we don't know to what server the client tried to connect and
any existing <code>ServerPath</code> is matched against the URI
from the request. The first matching path on the list is used and the
request is served from that vhost.

<p>If no matching vhost could be found the request is served from the
first vhost with a matching port number that is on the list for the IP
to which the client connected (as already mentioned before).

<h4>Persistent connections</h4>
The IP lookup described above is only done <em>once</em> for a particular
TCP/IP session while the name lookup is done on <em>every</em> request
during a KeepAlive/persistent connection. In other words a client may
request pages from different name-based vhosts during a single
persistent connection.


<h4>Absolute URI</h4>

<p>If the URI from the request is an absolute URI, and its hostname and
port match the main server or one of the configured virtual hosts
<em>and</em> match the address and port to which the client sent the request,
then the scheme/hostname/port prefix is stripped off and the remaining
relative URI is served by the corresponding main server or virtual host.
If it does not match, then the URI remains untouched and the request is
taken to be a proxy request.


<h3>Observations</h3>

<ul>

<li>A name-based vhost can never interfere with an IP-base vhost and
vice versa. IP-based vhosts can only be reached through an IP address
of its own address set and never through any other address.
The same applies to name-based vhosts, they can only be reached
through an IP address of the corresponding address set which must
be defined with a <code>NameVirtualHost</code> directive.
<p>

<li><code>ServerAlias</code> and <code>ServerPath</code> checks are never
performed for an IP-based vhost.
<p>

<li>The order of name-/IP-based, the <samp>_default_</samp>
vhost and the <code>NameVirtualHost</code> directive within the config
file is not important. Only the ordering
of name-based vhosts for a specific address set is significant. The one
name-based vhosts that comes first in the configuration file has
the highest priority for its corresponding address set.
<p>

<li>For security reasons the port number given in a <code>Host:</code>
header is never used during the matching process. Apache always
uses the real port to which the client sent the request.
<p>

<li>If a <code>ServerPath</code> directive exists which is a prefix of
another <code>ServerPath</code> directive that appears later in
the configuration file, then the former will always be matched
and the latter will never be matched. (That is assuming that no
Host header was available to disambiguate the two.)
<p>

<li>If two IP-based vhosts have an address in common, the vhost appearing
first in the config file is always matched. Such a thing might happen
inadvertently. The server will give a warning in the error
logfile when it detects this.
<p>

<li>A <code>_default_</code> vhost catches a request only if there is no
other vhost with a matching IP address <em>and</em> a matching port
number for the request. The request is only catched if the port number
to which the client sent the request matches the port number of your
<code>_default_</code> vhost which is your standard <code>Port</code>
by default. A wildcard port can be specified (i.e.
<code>_default_:*</code>) to catch requests to any available port.
<p>

<li>The main_server is only used to serve a request if the IP address
and port number to which the client connected is unspecified
and does not match any other vhost (including a <code>_default_</code>
vhost). In other words the main_server only catches a request for an
unspecified address/port combination (unless there is a <code>_default_</code>
vhost which matches that port).
<p>

<li>A <code>_default_</code> vhost or the main_server is <em>never</em>
matched for a request with an unknown or missing <code>Host:</code> header
if the client connected to an address (and port) which is used
for name-based vhosts, e.g. in a <code>NameVirtualHost</code> directive.
<p>

<li>You should never specify DNS names in <code>VirtualHost</code>
directives because it will force your server to rely on DNS to boot.
Furthermore it poses a security threat if you do not control the
DNS for all the domains listed.
There's <a href="../dns-caveats.html">more information</a>
available on this and the next two topics.
<p>

<li><code>ServerName</code> should always be set for each vhost. Otherwise
A DNS lookup is required for each vhost.
<p>

</ul>

<h3>Tips</h3>

<p>In addition to the tips on the <a href="../dns-caveats.html#tips">DNS
Issues</a> page, here are some further tips:

<ul>

<li>Place all main_server definitions before any <code>VirtualHost</code>
definitions. (This is to aid the readability of the configuration --
the post-config merging process makes it non-obvious that definitions
mixed in around virtual hosts might affect all virtual hosts.)
<p>

<li>Group corresponding <code>NameVirtualHost</code> and
<code>VirtualHost</code> definitions in your configuration to ensure
better readability.
<p>

<li>Avoid <code>ServerPaths</code> which are prefixes of other
<code>ServerPaths</code>. If you cannot avoid this then you have to
ensure that the longer (more specific) prefix vhost appears earlier in
the configuration file than the shorter (less specific) prefix
(<EM>i.e.</EM>, &quot;ServerPath /abc&quot; should appear after
&quot;ServerPath /abc/def&quot;).
<p>

</ul>

<!--#include virtual="footer.html" -->
</BODY>
</HTML>



1.1 apachen/htdocs/manual/vhosts/details_1_2.html

Index: details_1_2.html
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html><head>
<title>An In-Depth Discussion of VirtualHost Matching</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">An In-Depth Discussion of VirtualHost Matching</h1>

<p>This is a very rough document that was probably out of date the moment
it was written. It attempts to explain exactly what the code does when
deciding what virtual host to serve a hit from. It's provided on the
assumption that something is better than nothing. The server version
under discussion is Apache 1.2.

<p>If you just want to &quot;make it work&quot; without understanding
how, there's a <a href="#whatworks">What Works</a> section at the bottom.

<h3>Config File Parsing</h3>

<p>There is a main_server which consists of all the definitions appearing
outside of <CODE>VirtualHost</CODE> sections. There are virtual servers,
called <EM>vhosts</EM>, which are defined by
<A
HREF="mod/core.html#virtualhost"
><SAMP>VirtualHost</SAMP></A>
sections.

<p>The directives
<A
HREF="mod/core.html#port"
><SAMP>Port</SAMP></A>,
<A
HREF="mod/core.html#servername"
><SAMP>ServerName</SAMP></A>,
<A
HREF="mod/core.html#serverpath"
><SAMP>ServerPath</SAMP></A>,
and
<A
HREF="mod/core.html#serveralias"
><SAMP>ServerAlias</SAMP></A>
can appear anywhere within the definition of
a server. However, each appearance overrides the previous appearance
(within that server).

<p>The default value of the <code>Port</code> field for main_server
is 80. The main_server has no default <code>ServerName</code>,
<code>ServerPath</code>, or <code>ServerAlias</code>.

<p>In the absence of any
<A
HREF="mod/core.html#listen"
><SAMP>Listen</SAMP></A>
directives, the (final if there
are multiple) <code>Port</code> directive in the main_server indicates
which port httpd will listen on.

<p> The <code>Port</code> and <code>ServerName</code> directives for
any server main or virtual are used when generating URLs such as during
redirects.

<p> Each address appearing in the <code>VirtualHost</code> directive
can have an optional port. If the port is unspecified it defaults to
the value of the main_server's most recent <code>Port</code> statement.
The special port <SAMP>*</SAMP> indicates a wildcard that matches any port.
Collectively the entire set of addresses (including multiple
<SAMP>A</SAMP> record
results from DNS lookups) are called the vhost's <EM>address set</EM>.

<p> The magic <code>_default_</code> address has significance during
the matching algorithm. It essentially matches any unspecified address.

<p> After parsing the <code>VirtualHost</code> directive, the vhost server
is given a default <code>Port</code> equal to the port assigned to the
first name in its <code>VirtualHost</code> directive. The complete
list of names in the <code>VirtualHost</code> directive are treated
just like a <code>ServerAlias</code> (but are not overridden by any
<code>ServerAlias</code> statement). Note that subsequent <code>Port</code>
statements for this vhost will not affect the ports assigned in the
address set.

<p>
All vhosts are stored in a list which is in the reverse order that
they appeared in the config file. For example, if the config file is:

<blockquote><pre>
&lt;VirtualHost A&gt;
...
&lt;/VirtualHost&gt;

&lt;VirtualHost B&gt;
...
&lt;/VirtualHost&gt;

&lt;VirtualHost C&gt;
...
&lt;/VirtualHost&gt;
</pre></blockquote>

Then the list will be ordered: main_server, C, B, A. Keep this in mind.

<p>
After parsing has completed, the list of servers is scanned, and various
merges and default values are set. In particular:

<ol>
<li>If a vhost has no
<A
HREF="mod/core.html#serveradmin"
><code>ServerAdmin</code></A>,
<A
HREF="mod/core.html#resourceconfig"
><code>ResourceConfig</code></A>,
<A
HREF="mod/core.html#accessconfig"
><code>AccessConfig</code></A>,
<A
HREF="mod/core.html#timeout"
><code>Timeout</code></A>,
<A
HREF="mod/core.html#keepalivetimeout"
><code>KeepAliveTimeout</code></A>,
<A
HREF="mod/core.html#keepalive"
><code>KeepAlive</code></A>,
<A
HREF="mod/core.html#maxkeepaliverequests"
><code>MaxKeepAliveRequests</code></A>,
or
<A
HREF="mod/core.html#sendbuffersize"
><code>SendBufferSize</code></A>
directive then the respective value is
inherited from the main_server. (That is, inherited from whatever
the final setting of that value is in the main_server.)

<li>The &quot;lookup defaults&quot; that define the default directory
permissions
for a vhost are merged with those of the main server. This includes
any per-directory configuration information for any module.

<li>The per-server configs for each module from the main_server are
merged into the vhost server.
</ol>

Essentially, the main_server is treated as &quot;defaults&quot; or a
&quot;base&quot; on
which to build each vhost. But the positioning of these main_server
definitions in the config file is largely irrelevant -- the entire
config of the main_server has been parsed when this final merging occurs.
So even if a main_server definition appears after a vhost definition
it might affect the vhost definition.

<p> If the main_server has no <code>ServerName</code> at this point,
then the hostname of the machine that httpd is running on is used
instead. We will call the <EM>main_server address set</EM> those IP
addresses returned by a DNS lookup on the <code>ServerName</code> of
the main_server.

<p> Now a pass is made through the vhosts to fill in any missing
<code>ServerName</code> fields and to classify the vhost as either
an <EM>IP-based</EM> vhost or a <EM>name-based</EM> vhost. A vhost is
considered a name-based vhost if any of its address set overlaps the
main_server (the port associated with each address must match the
main_server's <code>Port</code>). Otherwise it is considered an IP-based
vhost.

<p> For any undefined <code>ServerName</code> fields, a name-based vhost
defaults to the address given first in the <code>VirtualHost</code>
statement defining the vhost. Any vhost that includes the magic
<SAMP>_default_</SAMP> wildcard is given the same <code>ServerName</code> as
the main_server. Otherwise the vhost (which is necessarily an IP-based
vhost) is given a <code>ServerName</code> based on the result of a reverse
DNS lookup on the first address given in the <code>VirtualHost</code>
statement.

<p>

<h3>Vhost Matching</h3>


<p><strong>Apache 1.3 differs from what is documented
here, and documentation still has to be written.</strong>

<p>
The server determines which vhost to use for a request as follows:

<p> <code>find_virtual_server</code>: When the connection is first made
by the client, the local IP address (the IP address to which the client
connected) is looked up in the server list. A vhost is matched if it
is an IP-based vhost, the IP address matches and the port matches
(taking into account wildcards).

<p> If no vhosts are matched then the last occurrence, if it appears,
of a <SAMP>_default_</SAMP> address (which if you recall the ordering of the
server list mentioned above means that this would be the first occurrence
of <SAMP>_default_</SAMP> in the config file) is matched.

<p> In any event, if nothing above has matched, then the main_server is
matched.

<p> The vhost resulting from the above search is stored with data
about the connection. We'll call this the <EM>connection vhost</EM>.
The connection vhost is constant over all requests in a particular TCP/IP
session -- that is, over all requests in a KeepAlive/persistent session.

<p> For each request made on the connection the following sequence of
events further determines the actual vhost that will be used to serve
the request.

<p> <code>check_fulluri</code>: If the requestURI is an absoluteURI, that
is it includes <code>http://hostname/</code>, then an attempt is made to
determine if the hostname's address (and optional port) match that of
the connection vhost. If it does then the hostname portion of the URI
is saved as the <EM>request_hostname</EM>. If it does not match, then the
URI remains untouched. <STRONG>Note</STRONG>: to achieve this address
comparison,
the hostname supplied goes through a DNS lookup unless it matches the
<code>ServerName</code> or the local IP address of the client's socket.

<p> <code>parse_uri</code>: If the URI begins with a protocol
(<EM>i.e.</EM>, <code>http:</code>, <code>ftp:</code>) then the request is
considered a proxy request. Note that even though we may have stripped
an <code>http://hostname/</code> in the previous step, this could still
be a proxy request.

<p> <code>read_request</code>: If the request does not have a hostname
from the earlier step, then any <code>Host:</code> header sent by the
client is used as the request hostname.

<p> <code>check_hostalias</code>: If the request now has a hostname,
then an attempt is made to match for this hostname. The first step
of this match is to compare any port, if one was given in the request,
against the <code>Port</code> field of the connection vhost. If there's
a mismatch then the vhost used for the request is the connection vhost.
(This is a bug, see observations.)

<p>
If the port matches, then httpd scans the list of vhosts starting with
the next server <STRONG>after</STRONG> the connection vhost. This scan does not
stop if there are any matches, it goes through all possible vhosts,
and in the end uses the last match it found. The comparisons performed
are as follows:

<ul>
<li>Compare the request hostname:port with the vhost
<code>ServerName</code> and <code>Port</code>.

<li>Compare the request hostname against any and all addresses given in
the <code>VirtualHost</code> directive for this vhost.

<li>Compare the request hostname against the <code>ServerAlias</code>
given for the vhost.
</ul>

<p>
<code>check_serverpath</code>: If the request has no hostname
(back up a few paragraphs) then a scan similar to the one
in <code>check_hostalias</code> is performed to match any
<code>ServerPath</code> directives given in the vhosts. Note that the
<STRONG>last match</STRONG> is used regardless (again consider the ordering of
the virtual hosts).

<h3>Observations</h3>

<ul>

<li>It is difficult to define an IP-based vhost for the machine's
&quot;main IP address&quot;. You essentially have to create a bogus
<code>ServerName</code> for the main_server that does not match the
machine's IPs.
<P>

<li>During the scans in both <code>check_hostalias</code> and
<code>check_serverpath</code> no check is made that the vhost being
scanned is actually a name-based vhost. This means, for example, that
it's possible to match an IP-based vhost through another address. But
because the scan starts in the vhost list at the first vhost that
matched the local IP address of the connection, not all IP-based vhosts
can be matched.
<p>
Consider the config file above with three vhosts A, B, C. Suppose
that B is a named-based vhost, and A and C are IP-based vhosts. If
a request comes in on B or C's address containing a header
&quot;<SAMP>Host: A</SAMP>&quot; then
it will be served from A's config. If a request comes in on A's
address then it will always be served from A's config regardless of
any Host: header.
</p>

<li>Unless you have a <SAMP>_default_</SAMP> vhost,
it doesn't matter if you mix name-based vhosts in amongst IP-based
vhosts. During the <code>find_virtual_server</code> phase above no
named-based vhost will be matched, so the main_server will remain the
connection vhost. Then scans will cover all vhosts in the vhost list.
<p>
If you do have a <SAMP>_default_</SAMP> vhost, then you cannot place
named-based vhosts after it in the config. This is because on any
connection to the main server IPs the connection vhost will always be
the <SAMP>_default_</SAMP> vhost since none of the name-based are
considered during <code>find_virtual_server</code>.
</p>

<li>You should never specify DNS names in <code>VirtualHost</code>
directives because it will force your server to rely on DNS to boot.
Furthermore it poses a security threat if you do not control the
DNS for all the domains listed.
<a href="dns-caveats.html">There's more information
available on this and the next two topics</a>.
<p>

<li><code>ServerName</code> should always be set for each vhost. Otherwise
A DNS lookup is required for each vhost.
<p>

<li>A DNS lookup is always required for the main_server's
<code>ServerName</code> (or to generate that if it isn't specified
in the config).
<p>

<li>If a <code>ServerPath</code> directive exists which is a prefix of
another <code>ServerPath</code> directive that appears later in
the configuration file, then the former will always be matched
and the latter will never be matched. (That is assuming that no
Host header was available to disambiguate the two.)
<p>

<li>If a vhost that would otherwise be a name-vhost includes a
<code>Port</code> statement that doesn't match the main_server
<code>Port</code> then it will be considered an IP-based vhost.
Then <code>find_virtual_server</code> will match it (because
the ports associated with each address in the address set default
to the port of the main_server) as the connection vhost. Then
<code>check_hostalias</code> will refuse to check any other name-based
vhost because of the port mismatch. The result is that the vhost
will steal all hits going to the main_server address.
<p>

<li>If two IP-based vhosts have an address in common, the vhost appearing
later in the file is always matched. Such a thing might happen
inadvertently. If the config has name-based vhosts and for some reason
the main_server <code>ServerName</code> resolves to the wrong address
then all the name-based vhosts will be parsed as ip-based vhosts.
Then the last of them will steal all the hits.
<P>

<li>The last name-based vhost in the config is always matched for any hit
which doesn't match one of the other name-based vhosts.

</ul>

<h3><a name="whatworks">What Works</a></h3>

<p>In addition to the tips on the <a href="dns-caveats.html#tips">DNS
Issues</a> page, here are some further tips:

<ul>

<li>Place all main_server definitions before any VirtualHost definitions.
(This is to aid the readability of the configuration -- the post-config
merging process makes it non-obvious that definitions mixed in around
virtualhosts might affect all virtualhosts.)
<p>

<li>Arrange your VirtualHosts such
that all name-based virtual hosts come first, followed by IP-based
virtual hosts, followed by any <SAMP>_default_</SAMP> virtual host
<p>

<li>Avoid <code>ServerPaths</code> which are prefixes of other
<code>ServerPaths</code>. If you cannot avoid this then you have to
ensure that the longer (more specific) prefix vhost appears earlier in
the configuration file than the shorter (less specific) prefix
(<EM>i.e.</EM>, &quot;ServerPath /abc&quot; should appear after
&quot;ServerPath /abcdef&quot;).
<p>

<li>Do not use <EM>port-based</EM> vhosts in the same server as
name-based vhosts. A loose definition for port-based is a vhost which
is determined by the port on the server (<em>i.e.</em>, one server with
ports 8000, 8080, and 80 - all of which have different configurations).
<p>

</ul>

<!--#include virtual="footer.html" -->
</BODY>
</HTML>



1.1 apachen/htdocs/manual/vhosts/examples.html

Index: examples.html
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html><head>
<title>VirtualHost Examples</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">Virtual Host examples for common setups</h1>


<h2>Base configuration</h2>

<ul>
<li><A HREF="#ip">IP-based vhosts only</A>
<li><A HREF="#name">Name-based vhosts only</A>
<li><A HREF="#mixed">Mixed name-/IP-based vhosts</A>
<li><A HREF="#port">Port-based vhosts</A>
</ul>

<h2>Additional features</h2>

<ul>
<li><A HREF="#default">Using <code>_default_</code> vhosts</A>
<li><A HREF="#migrate">Migrating a named-based vhost to an IP-based vhost</A>
<li><A HREF="#serverpath">Using the <code>ServerPath</code> directive</A>
</ul>

<HR>

<h3><A NAME="ip">IP-based vhosts only</A></h3>

<ul>

<li><b>Setup 1:</b>
The server machine has two IP addresses (<samp>111.22.33.44</samp>
and <samp>111.22.33.55</samp>)
which resolve to the names <samp>server.domain.tld</samp> and
<samp>www.otherdomain.tld</samp> respectively.
The hostname <samp>www.domain.tld</samp> is an alias (CNAME)
for <samp>server.domain.tld</samp> and will represent the
main server.
<p>
<b>Server configuration:</b>


<blockquote><pre>
...
Port 80
DocumentRoot /www/domain
ServerName www.domain.tld

&lt;VirtualHost 111.22.33.55&gt;
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
&lt;/VirtualHost&gt;
</pre>
<samp>www.otherdomain.tld</samp> can only be reached through the
address <samp>111.22.33.55</samp>, while <samp>www.domain.tld</samp>
can only be reached through <samp>111.22.33.44</samp>
(which represents our main server).
</blockquote>
<p>

<li><b>Setup 2:</b>
Same as setup 1, but we don't want to have a dedicated main server.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
Port 80
ServerName server.domain.tld

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/domain
ServerName www.domain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.55&gt;
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
&lt;/VirtualHost&gt;
</pre>
The main server can never catch a request, because all IP address
of our machine are in use for IP-based virtual hosts
(only <samp>localhost</samp> requests can hit the main server).
</blockquote>
<p>

<li><b>Setup 3:</b>
The server machine has two IP addresses (<samp>111.22.33.44</samp>
and <samp>111.22.33.55</samp>)
which resolve to the names <samp>server.domain.tld</samp> and
<samp>www-cache.domain.tld</samp> respectively.
The hostname <samp>www.domain.tld</samp> is an alias (CNAME)
for <samp>server.domain.tld</samp> and will represent the
main server.
<samp>www-cache.domain.tld</samp> will become our proxy-cache
listening on port 8080, while the web server itself uses the default
port 80.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
Port 80
Listen 111.22.33.44:80
Listen 111.22.33.55:8080
ServerName server.domain.tld

&lt;VirtualHost 111.22.33.44:80&gt;
DocumentRoot /www/domain
ServerName www.domain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.55:8080&gt;
ServerName www-cache.domain.tld
...
&lt;Directory proxy:&gt;
order deny,allow
deny from all
allow from 111.22.33
&lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
The main server can never catch a request, because all IP addresss
(apart from <samp>localhost</samp>) of our machine are in use for IP-based
virtual hosts. The web server can only be reached on the first address
through port 80 and the proxy only on the second address through port 8080.
</blockquote>
</ul>
<HR>

<h3><A NAME="name">Name-based vhosts only</A></h3>

<ul>

<li><b>Setup 1:</b>
The server machine has one IP address (<samp>111.22.33.44</samp>)
which resolves to the name <samp>server.domain.tld</samp>.
There are two aliases (CNAMEs) <samp>www.domain.tld</samp> and
<samp>www.sub.domain.tld</samp> for the address <samp>111.22.33.44</samp>.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
Port 80
ServerName server.domain.tld

NameVirtualHost 111.22.33.44

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/domain
ServerName www.domain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
...
&lt;/VirtualHost&gt;
</pre>
Apart from <samp>localhost</samp> there are no unspecified
addresses/ports, therefore the main server only serves
<samp>localhost</samp> requests. Due to the fact
that <samp>www.domain.tld</samp> has the highest priority
it can be seen as the <cite>default</cite> or
<cite>primary</cite> server.
</blockquote>
<p>

<li><b>Setup 2:</b>
The server machine has two IP addresses (<samp>111.22.33.44</samp>
and <samp>111.22.33.55</samp>)
which resolve to the names <samp>server1.domain.tld</samp> and
<samp>server2.domain.tld</samp> respectively.
The alias <samp>www.domain.tld</samp> should be used for the
main server which should also catch any unspecified addresses.
We want to use a virtual host for the alias
<samp>www.otherdomain.tld</samp> and one virtual host should
catch any request to hostnames of the form
<samp>*.sub.domain.tld</samp> with <samp>www.sub.domain.tld</samp>
as its server name. The address <samp>111.22.33.55</samp> should be
used for the virtual hosts.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
Port 80
ServerName www.domain.tld
DocumentRoot /www/domain

NameVirtualHost 111.22.33.55

&lt;VirtualHost 111.22.33.55&gt;
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.55&gt;
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
ServerAlias *.sub.domain.tld
...
&lt;/VirtualHost&gt;
</pre>
Any request to an address other than <samp>111.22.33.55</samp>
will be served from the main server. A request to
<samp>111.22.33.55</samp> with an unknown or no <code>Host:</code>
header will be served from <samp>www.otherdomain.tld</samp>.
</blockquote>
</ul>

<HR>

<h3><A NAME="mixed">Mixed name-/IP-based vhosts</A></h3>

<Ul>

<li><b>Setup:</b>
The server machine has three IP addresses (<samp>111.22.33.44</samp>,
<samp>111.22.33.55</samp> and <samp>111.22.33.66</samp>)
which resolve to the names <samp>server.domain.tld</samp>,
<samp>www.otherdomain1.tld</samp> and <samp>www.otherdomain2.tld</samp>
respectively.
The address <samp>111.22.33.44</samp> should we used for a couple
of name-based vhosts and the other addresses for IP-based vhosts.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
Port 80
ServerName server.domain.tld

NameVirtualHost 111.22.33.44

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/domain
ServerName www.domain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/subdomain1
ServerName www.sub1.domain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/subdomain2
ServerName www.sub2.domain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.55&gt;
DocumentRoot /www/otherdomain1
ServerName www.otherdomain1.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.66&gt;
DocumentRoot /www/otherdomain2
ServerName www.otherdomain2.tld
...
&lt;/VirtualHost&gt;
</pre></blockquote>

</ul>

<HR>

<h3><A NAME="port">Port-based vhosts</A></h3>

<ul>

<li><b>Setup:</b>
The server machine has one IP address (<samp>111.22.33.44</samp>)
which resolves to the name <samp>www.domain.tld</samp>.
If we don't have the option to get another address or alias
for our server we can use port-based vhosts if we need
a virtual host with a different configuration.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
Listen 80
Listen 8080
ServerName www.domain.tld
DocumentRoot /www/domain

&lt;VirtualHost 111.22.33.44:8080&gt;
DocumentRoot /www/domain2
...
&lt;/VirtualHost&gt;
</pre>
A request to <samp>www.domain.tld</samp> on port 80 is served
from the main server and a request to port 8080 is served from
the virtual host.
</blockquote>
</ul>

<HR>

<h3><A NAME="default">Using <code>_default_</code> vhosts</A></h3>

<ul>

<li><b>Setup 1:</b>
Catching <em>every</em> request to any unspecified IP address and port,
i.e. an address/port combination that is not used for any other
virtual host.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
&lt;VirtualHost _default_:*&gt;
DocumentRoot /www/default
...
&lt;/VirtualHost&gt;
</pre>
Using such a default vhost with a wildcard port effectively
prevents any request going to the main server.<br>
A default vhost never serves a request that was sent to an
address/port that is used for name-based vhosts. If the request
contained an unknown or no <code>Host:</code> header it is
always served from the primary name-based vhost (the
vhost for that address/port appearing first in the configuration
file).<br>
You can use
<A HREF="../mod/mod_alias.html#aliasmatch"><code>AliasMatch</code></A>
or
<A HREF="../mod/mod_rewrite.html#RewriteRule"><code>RewriteRule</code></A>
to rewrite any request to a single information page (or script).
</blockquote>
<p>

<li><b>Setup 2:</b>
Same as setup 1, but the server listens on several ports and
we want to use a second <code>_default_</code> vhost for port 80.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
&lt;VirtualHost _default_:80&gt;
DocumentRoot /www/default80
...
&lt;/VirtualHost&gt;

&lt;VirtualHost _default_:*&gt;
DocumentRoot /www/default
...
&lt;/VirtualHost&gt;
</pre>
The default vhost for port 80 (which <em>must</em> appear before
any default vhost with a wildcard port) catches all requests that
were sent to an unspecified IP address. The main server is
never used to serve a request.
</blockquote>
<p>

<li><b>Setup 3:</b>
We want to have a default vhost for port 80, but no other default vhosts.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
&lt;VirtualHost _default_:80&gt;
DocumentRoot /www/default
...
&lt;/VirtualHost&gt;
</pre>
A request to an unspecified address on port 80 is served from the
default vhost any other request to an unspecified address and port
is served from the main server.
</blockquote>

</ul>

<HR>

<h3><A NAME="migrate">Migrating a name-based vhost to an IP-based vhost</A></h3>

<ul>

<li><b>Setup:</b>
The name-based vhost with the hostname
<samp>www.otherdomain.tld</samp> (from our <a href="#name">name-based</A>
example, setup 2) should get its own IP address.
To avoid problems with name servers or proxies who cached the old
IP address for the name-based vhost we want to provide both variants
during a migration phase.<br>
The solution is easy, because we can simply add the new IP address
(<samp>111.22.33.66</samp>) to the <code>VirtualHost</code> directive.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
Port 80
ServerName www.domain.tld
DocumentRoot /www/domain

NameVirtualHost 111.22.33.55

&lt;VirtualHost 111.22.33.55 111.22.33.66&gt;
DocumentRoot /www/otherdomain
ServerName www.otherdomain.tld
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.55&gt;
DocumentRoot /www/subdomain
ServerName www.sub.domain.tld
ServerAlias *.sub.domain.tld
...
&lt;/VirtualHost&gt;
</pre>
The vhost can now be accessed through the new address (as an IP-based
vhost) and through the old address (as a name-based vhost).
</blockquote>

</ul>

<HR>

<h3><A NAME="serverpath">Using the <code>ServerPath</code> directive</A></h3>

<ul>

<li><b>Setup:</b>
We have a server with two name-based vhosts. In order to match the correct
virtual host a client must send the correct <code>Host:</code> header.
Old HTTP/1.0 clients do not send such a header and Apache has no clue
what vhost the client tried to reach (and serves the request from
the primary vhost). To provide as much backward compatibility
as possible we create a primary vhost which returns a single page
containing links with an URL prefix to the name-based virtual hosts.
<p>
<b>Server configuration:</b>

<blockquote><pre>
...
NameVirtualHost 111.22.33.44

&lt;VirtualHost 111.22.33.44&gt;
# primary vhost
DocumentRoot /www/subdomain
RewriteEngine On
RewriteRule ^/.* /www/subdomain/index.html
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/subdomain/sub1
ServerName www.sub1.domain.tld
ServerPath /sub1/
RewriteEngine On
RewriteRule ^(/sub1/.*) /www/subdomain$1
...
&lt;/VirtualHost&gt;

&lt;VirtualHost 111.22.33.44&gt;
DocumentRoot /www/subdomain/sub2
ServerName www.sub2.domain.tld
ServerPath /sub2/
RewriteEngine On
RewriteRule ^(/sub2/.*) /www/subdomain$1
...
&lt;/VirtualHost&gt;
</pre>
Due to the <A HREF="../mod/core.html#serverpath"><code>ServerPath</code></A>
directive a request to the
URL <samp>http://www.sub1.domain.tld/sub1/</samp> is <em>always</em>
served from the sub1-vhost. <br>
A request to the URL <samp>http://www.sub1.domain.tld/</samp>
is only served from the sub1-vhost if the client sent a correct
<code>Host:</code> header.
If no <code>Host:</code> header is sent the client gets the
information page from the primary host.<br>
Please note that there is one oddity: A request to
<samp>http://www.sub2.domain.tld/sub1/</samp> is also served from
the sub1-vhost if the client sent no <code>Host:</code> header. <br>
The <code>RewriteRule</code> directives are used to make sure that
a client which sent a correct <code>Host:</code> header can use
both URL variants, i.e. with or without URL prefix.
</blockquote>

</ul>

<!--#include virtual="footer.html" -->
</BODY>
</HTML>



1.1 apachen/htdocs/manual/vhosts/fd-limits.html

Index: fd-limits.html
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Apache Server Virtual Host Support</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">File Descriptor Limits</h1>

<P>
When using a large number of Virtual Hosts, Apache may run out of available
file descriptors (sometimes called <cite>file handles</cite> if each Virtual
Host specifies different log files.
The total number of file descriptors used by Apache is one for each distinct
error log file, one for every other log file directive, plus 10-20 for
internal use. Unix operating systems limit the number of file descriptors that
may be used by a process; the limit is typically 64, and may usually be
increased up to a large hard-limit.
<p>
Although Apache attempts to increase the limit as required, this
may not work if:
<ol>
<li>Your system does not provide the setrlimit() system call.
<li>The setrlimit(RLIMIT_NOFILE) call does not function on your system
(such as Solaris 2.3)
<li>The number of file descriptors required exceeds the hard limit.
<li>Your system imposes other limits on file descriptors, such as a limit
on stdio streams only using file descriptors below 256. (Solaris 2)
</ol>

In the event of problems you can:
<ul>
<li>Reduce the number of log files; don't specify log files in the VirtualHost
sections, but only log to the main log files.
<li>If you system falls into 1 or 2 (above), then increase the file descriptor
limit before starting Apache, using a script like
<blockquote><code>
#!/bin/sh <br>
ulimit -S -n 100 <br>
exec httpd</code></blockquote>
</ul>
<P>
Please see the
<A HREF="../misc/descriptors.html">Descriptors and Apache</A>
document containing further details about file descriptor problems and how
they can be solved on your operating system.
</P>

<!--#include virtual="footer.html" -->
</body></html>




1.1 apachen/htdocs/manual/vhosts/footer.html

Index: footer.html
===================================================================
<HR>
<H3 ALIGN="CENTER">
Apache HTTP Server Version 1.3
</H3>

<A HREF="./"><IMG SRC="images/index.gif" ALT="Index"></A>



1.1 apachen/htdocs/manual/vhosts/header.html

Index: header.html
===================================================================
<DIV ALIGN="CENTER">
<IMG SRC="images/sub.gif" ALT="[APACHE DOCUMENTATION]">
<H3>
Apache HTTP Server Version 1.3
</H3>
</DIV>



1.1 apachen/htdocs/manual/vhosts/index.html

Index: index.html
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Apache Virtual Host documentation</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 Virtual Host documentation</h1>

<p>The term <cite>Virtual Host</cite> refers to the practice of maintaining
more than one server on one machine, as differentiated by their apparent
hostname. For example, it is often desirable for companies sharing a
web server to have their own domains, with web servers accessible as
<samp>www.company1.com</samp> and <samp>www.company2.com</samp>,
without requiring the user to know any extra path information.</p>

<p>Apache was one of the first servers to support IP-based
virtual hosts right out of the box. Versions 1.1 and later of
Apache support both, IP-based and name-based virtual hosts (vhosts).
The latter variant of virtual hosts is sometimes also called host-based or
non-IP virtual hosts.</P>

<P>Below is a list of documentation pages which explain all details
of virtual host support in Apache version 1.3 and later.</P>

<HR>

<H2>Virtual Host Support</H2>

<UL>
<LI><A HREF="ip-based.html">IP-based Virtual Hosts</A>
<LI><A HREF="name-based.html">Name-based Virtual Hosts</A>
<LI><A HREF="examples.html">Virtual Host examples for common setups</A>
<LI><A HREF="details.html">In-Depth Discussion of Virtual Host Matching</A>
<LI><A HREF="fd-limits.html">File Descriptor Limits</A>
</UL>

<H2>Configuration directives</H2>

<UL>
<LI><A HREF="../mod/core.html#virtualhost">&lt;VirtualHost&gt;</A>
<LI><A HREF="../mod/core.html#namevirtualhost">NameVirtualHost</A>
<LI><A HREF="../mod/core.html#servername">ServerName</A>
<LI><A HREF="../mod/core.html#serveralias">ServerAlias</A>
<LI><A HREF="../mod/core.html#serverpath">ServerPath</A>
</UL>

<!--#include virtual="footer.html" -->
</BODY>
</HTML>



1.1 apachen/htdocs/manual/vhosts/ip-based.html

Index: ip-based.html
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Apache IP-based Virtual Host Support</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 IP-based Virtual Host Support</h1>

<strong>See also:</strong>
<a href="name-based.html">Name-based Virtual Hosts Support</a>

<HR>

<h2>System requirements</h2>
As the term <cite>IP-based</cite> indicates, the server <strong>must have a
different IP address for each IP-based virtual host</strong>.
This can be achieved by the machine having several physical network connections,
or by use of virtual interfaces which are supported by most modern
operating systems (see system documentation for details).

<h2>How to set up Apache</h2>
There are two ways of configuring apache to support multiple hosts.
Either by running a separate httpd daemon for each hostname, or by running a
single daemon which supports all the virtual hosts.
<p>
Use multiple daemons when:
<ul>
<li>The different virtual hosts need very different httpd configurations, such
as different values for: <A HREF="../mod/core.html#servertype">ServerType</A>,
<A HREF="../mod/core.html#user">User</A>,
<A HREF="../mod/core.html#group">Group</A>,
<A HREF="../mod/mod_mime.html#typesconfig">TypesConfig</A> or
<A HREF="../mod/core.html#serverroot">ServerRoot</A>.
<li>The machine does not process a very high request rate.
</ul>
Use a single daemon when:
<ul>
<li>Sharing of the httpd configuration between virtual hosts is acceptable.
<li>The machine services a large number of requests, and so the performance
loss in running separate daemons may be significant.
</ul>

<h2>Setting up multiple daemons</h2>
Create a separate httpd installation for each virtual host.
For each installation, use the
<A HREF="../mod/core.html#listen">Listen</A> directive in the configuration
file to select which IP address (or virtual host) that daemon services.
e.g.
<pre>
Listen www.smallco.com:80
</pre>
It is recommended that you use an IP address instead of a hostname
(see <A HREF="../dns-caveats.html">DNS page</A>).

<h2>Setting up a single daemon with virtual hosts</h2>
For this case, a single httpd will service requests for the main server
and all the virtual hosts.
The <A HREF="../mod/core.html#virtualhost">VirtualHost</A> directive in the
configuration file is used to set the values of
<A HREF="../mod/core.html#serveradmin">ServerAdmin</A>,
<A HREF="../mod/core.html#servername">ServerName</A>,
<A HREF="../mod/core.html#documentroot">DocumentRoot</A>,
<A HREF="../mod/core.html#errorlog">ErrorLog</A> and
<A HREF="../mod/mod_log_config.html#transferlog">TransferLog</A> or
<A HREF="../mod/mod_log_config.html#customlog">CustomLog</A>
configuration directives to different values for each virtual host.
e.g.
<pre>
&lt;VirtualHost www.smallco.com&gt;
ServerAdmin webmaster@mail.smallco.com
DocumentRoot /groups/smallco/www
ServerName www.smallco.com
ErrorLog /groups/smallco/logs/error_log
TransferLog /groups/smallco/logs/access_log
&lt;/VirtualHost&gt;

&lt;VirtualHost www.baygroup.org&gt;
ServerAdmin webmaster@mail.baygroup.org
DocumentRoot /groups/baygroup/www
ServerName www.baygroup.org
ErrorLog /groups/baygroup/logs/error_log
TransferLog /groups/baygroup/logs/access_log
&lt;/VirtualHost&gt;
</pre>

It is recommended that you use an IP address instead of a hostname
(see <A HREF="../dns-caveats.html">DNS page</A>).

<P>

Almost <strong>any</strong> configuration directive can be put
in the VirtualHost directive, with the exception of
<A HREF="../mod/core.html#servertype">ServerType</A>,
<A HREF="../mod/core.html#startservers">StartServers</A>,
<A HREF="../mod/core.html#maxspareservers">MaxSpareServers</A>,
<A HREF="../mod/core.html#minspareservers">MinSpareServers</A>,
<A HREF="../mod/core.html#maxrequestsperchild">MaxRequestsPerChild</A>,
<A HREF="../mod/core.html#bindaddress">BindAddress</A>,
<A HREF="../mod/core.html#listen">Listen</A>,
<A HREF="../mod/core.html#pidfile">PidFile</A>,
<A HREF="../mod/mod_mime.html#typesconfig">TypesConfig</A>,
<A HREF="../mod/core.html#serverroot">ServerRoot</A> and
<A HREF="../mod/core.html#namevirtualhost">NameVirtualHost</A>.
<P>
<A HREF="../mod/core.html#user">User</A> and
<A HREF="../mod/core.html#group">Group</A> maybe used inside a VirtualHost
directive if the <A HREF="../suexec.html">suEXEC wrapper</A> is used.
<P>

<EM>SECURITY:</EM> When specifying where to write log files, be aware
of some security risks which are present if anyone other than the
user that starts Apache has write access to the directory where they
are written. See the <A HREF="../misc/security_tips.html">security
tips</A> document for details.
</P>

<!--#include virtual="footer.html" -->
</body>
</html>




1.1 apachen/htdocs/manual/vhosts/name-based.html

Index: name-based.html
===================================================================
<!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>
<a href="ip-based.html">IP-based Virtual Host Support</a>

<hr>

<h2>Name-based vs. IP-based virtual hosts</h2>

<p>While the approach with IP-based virtual hosts works still 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
machines. The <code>HTTP/1.1</code> protocol contains a method for the
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
files (most likely <code>httpd.conf</code> or <code>srm.conf</code>)
code similar to the following:</p>
<pre>
NameVirtualHost 111.22.33.44

&lt;VirtualHost 111.22.33.44&gt;
ServerName www.domain.tld
DocumentRoot /web/domain
&lt;/VirtualHost&gt;
</pre>

<p>The notable difference between IP-based and name-based virtual host
configuration is the
<A HREF="../mod/core.html#namevirtualhost"><code>NameVirtualHost</code></A>
directive which specifies any 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>&lt;VirtualHost&gt;</code> section. To make this work,
all that is needed is to make sure that the name
<samp>www.domain.tld</samp> is an alias (CNAME) pointing to the IP address
<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
as <code>domain.tld</code>, or <code>www2.domain.tld</code>, assuming
the IP addresses pointed to the same server. In fact, one might want it
so that all addresses at <code>domain.tld</code> were picked up by the
server. This is possible with the
<A HREF="../mod/core.html#serveralias"><code>ServerAlias</code></A>
directive, placed inside the &lt;VirtualHost&gt; 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
<code>ServerAlias www www.foobar</code>. It isn't possible for the
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
<A HREF="../mod/core.html#serverpath"><code>ServerPath</code></A>
directive, albeit a slightly cumbersome one:</p>

<p>Example configuration:

<pre>
NameVirtualHost 111.22.33.44

&lt;VirtualHost 111.22.33.44&gt;
ServerName www.domain.tld
ServerPath /domain
DocumentRoot /web/domain
&lt;/VirtualHost&gt;
</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
<samp>www.domain.tld</samp> This means that the pages can be accessed as
<code>http://www.domain.tld/domain/</code> for all clients, although
clients sending a <samp>Host:</samp> header can also access it as
<code>http://www.domain.tld/</code>.</p>

<p>In order to make this work, put a link on your primary virtual host's page
to <samp>http://www.domain.tld/domain/</samp>
Then, in the virtual host's pages, be sure to use either purely
relative links (e.g. "<samp>file.html</samp>" or
"<samp>../icons/image.gif</samp>" or links containing the prefacing
<samp>/domain/</samp>
(e.g. "<samp>http://www.domain.tld/domain/misc/file.html</samp>" or
"<samp>/domain/misc/file.html</samp>").</p>

<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>

<p>See also: <A HREF="examples.html#serverpath">ServerPath configuration
example</A></p>

<!--#include virtual="footer.html" -->
</BODY>
</HTML>