mirror of
https://github.com/apache/httpd.git
synced 2025-05-19 02:21:09 +03:00
Submitted by: Chris Pepper <pepper@mail.reppep.com> git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86675 13f79535-47bb-0310-9956-ffa450edef68
170 lines
6.6 KiB
HTML
170 lines
6.6 KiB
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>Early versions of HTTP (like many other protocols, e.g. FTP)
|
|
required a different IP address for each virtual host on the server.
|
|
On some platforms this can limit the number of virtual hosts you can
|
|
run, and because there are concerns about the availability of IP
|
|
addresses it is strongly discouraged by the registraries (ARIN, RIPE,
|
|
and APNIC).</P>
|
|
|
|
<P>The <CODE>HTTP/1.1</CODE> protocol, and a common extension to
|
|
<CODE>HTTP/1.0</CODE>, includes 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 old IP-address-per-hostname method.</P>
|
|
|
|
<P>The benefits of using the name-based virtual hosts is a practically
|
|
unlimited number of servers, ease of configuration and use, and it
|
|
requires no additional hardware or software. The main disadvantage is
|
|
that the client must support this part of the protocol. Almost all
|
|
browsers do, but there are still tiny numbers of very old browsers in
|
|
use which do not. This can cause problems, although a possible
|
|
solution is addressed below.</P>
|
|
|
|
<H2>Using name-based virtual hosts</H2>
|
|
|
|
<P>Using name-based virtual hosts is quite easy, and superficially looks
|
|
like the old method. 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 an IP address that should be used as a
|
|
target for name-based virtual hosts, or the wildcard <CODE>*</CODE> to
|
|
indicate that the server only does name-based virtual hosting (no
|
|
IP-based virtual hosting).</P>
|
|
|
|
<P>For example, suppose that both <SAMP>www.domain.tld</SAMP> and
|
|
<SAMP>www.otherdomain.tld</SAMP> point at the IP address of your
|
|
server. Then 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 *
|
|
|
|
<VirtualHost *>
|
|
ServerName www.domain.tld
|
|
DocumentRoot /www/domain
|
|
</VirtualHost>
|
|
|
|
<VirtualHost *>
|
|
ServerName www.otherdomain.tld
|
|
DocumentRoot /www/otherdomain
|
|
</VirtualHost>
|
|
</PRE>
|
|
|
|
<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 names
|
|
<SAMP>www.domain.tld</SAMP> and <SAMP>www.otherdomain.tld</SAMP>
|
|
are pointing to the right IP address.
|
|
|
|
<P>Note: When you specify an IP address in a <CODE>NameVirtualHost</CODE>
|
|
directive then requests to that IP address will only ever be served
|
|
by matching <VirtualHost>s. The "main server" will
|
|
<STRONG>never</STRONG> be served from the specified IP address.
|
|
If you specify a wildcard then the "main server" isn't used at all.
|
|
If you start to use virtual hosts you should stop using the "main server"
|
|
as an independent server and rather use it as a place for
|
|
configuration directives that are common for all your virtual hosts.
|
|
In other words, you should add a <VirtualHost> section for
|
|
<EM>every</EM> server (hostname) you want to maintain on your server.
|
|
|
|
<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 <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
|
|
<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.
|
|
The <CODE>ServerAlias</CODE> directive is generally a way to have different
|
|
hostnames pointing to the same virtual host.
|
|
</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
|
|
first virtual host listed for that IP address (the
|
|
<CITE>primary</CITE> name-based virtual host).</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
|
|
|
|
<VirtualHost 111.22.33.44>
|
|
ServerName www.domain.tld
|
|
ServerPath /domain
|
|
DocumentRoot /web/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
|
|
<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 (<EM>e.g.</EM>, "<SAMP>file.html</SAMP>" or
|
|
"<SAMP>../icons/image.gif</SAMP>" or links containing the prefacing
|
|
<SAMP>/domain/</SAMP>
|
|
(<EM>e.g.</EM>, "<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>
|