mirror of
https://github.com/apache/httpd.git
synced 2025-08-27 16:41:57 +03:00
PR: 3745 Submitted by: Roger Pack <roger.pack@juno.com> git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@82804 13f79535-47bb-0310-9956-ffa450edef68
165 lines
6.3 KiB
HTML
165 lines
6.3 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>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
|
|
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. 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.</P>
|
|
|
|
<P>For example, suppose that both <SAMP>www.domain.tld</SAMP> and
|
|
<SAMP>www.otherdomain.tld</SAMP> point at the IP address
|
|
<SAMP>111.22.33.44</SAMP>. 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 111.22.33.44
|
|
|
|
<VirtualHost 111.22.33.44>
|
|
ServerName www.domain.tld
|
|
DocumentRoot /www/domain
|
|
</VirtualHost>
|
|
|
|
<VirtualHost 111.22.33.44>
|
|
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 IP address <SAMP>111.22.33.44</SAMP></P>
|
|
|
|
<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 start to use virtual hosts you should stop to use 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>
|