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