For simple name-based virtual hosts, you might use the following directives in your server-configuration file:
UseCanonicalName Off VirtualDocumentRoot /usr/local/apache/vhosts/%0
A request for http://www.example.com/directory/file.html will be satisfied by the file /usr/local/apache/vhosts/www.example.com/directory/file.html.
On .../site.dynamic we have implemented a version of the familiar Buttterthlies site, with a password-protected salesperson’s department. The first Config file, .../conf/httpd1.conf, is as follows:
User webuser Group webgroup ServerName my586 UseCanonicalName Off VirtualDocumentRoot /usr/www/APACHE3/site.dynamic/htdocs/%0 <Directory /usr/www/APACHE3/site.dynamic/htdocs/sales.butterthlies.com> AuthType Basic AuthName Darkness AuthUserFile /usr/www/APACHE3/ok_users/sales AuthGroupFile /usr/www/APACHE3/ok_users/groups Require group cleaners </Directory>
Launch it with go 1
; it responds nicely to
http://www.butterthlies.com and
http://sales.butterthlies.com.
There is an equivalent VirtualScriptAlias
directive, but it insists on URLs containing ../cgi-bin/... — for instance,
www.butterthlies.com/cgi-bin/mycgi. In view of
the reputed horror some search engines have for
“cgi-bin”, you might prefer not to
use it and to keep “cgi-bin” out of
your URLs with this:
ScriptAliasMatch /(.*) /usr/www/APACHE3/cgi-bin/handler/$1
The effect should be that any visitor to <http://yourURL>/fredwill call the script .../cgi-bin/handler and pass “fred” to it in the PATH_INFO Environment variable.
If you have a very large number of virtual hosts, it’s a good idea to arrange the files to reduce the size of the vhosts directory. To do this, you might use the following in your configuration file:
UseCanonicalName Off VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2
A request for http://www.example.isp.com/directory/file.html
will be satisfied by the file
/usr/local/apache/vhosts/isp.com/e/x/a/example/directory/file.html
(because isp.com matches to
%3+
, e matches to
%2.1
— the first character of the second part
of the URL example, and so on).
The point is that most OSes are very slow if you have
thousands of subdirectories in a single directory: this scheme
spreads them out.
A more even spread of files can often be achieved by selecting from the end of the name, for example:
VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.-1/%2.-2/%2.-3/%2
The example request would come from /usr/local/apache/vhosts/isp.com/e/l/p/example/directory/file.html. Alternatively, you might use:
VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2.4+
The example request would come from /usr/local/apache/vhosts/isp.com/e/x/a/mple/directory/file.html.
For IP-based virtual hosting you might use the following in your configuration file:
UseCanonicalName DNS VirtualDocumentRootIP /usr/local/apache/vhosts/%1/%2/%3/%4/docs VirtualScriptAliasIP /usr/local/apache/vhosts/%1/%2/%3/%4/cgi-bin
A request for http://www.example.isp.com/directory/file.html would be satisfied by the file /usr/local/apache/vhosts/10/20/30/40/docs/directory/file.html if the IP address of www.example.com were 10.20.30.40. A request for http://www.example.isp.com/cgi-bin/script.pl would be satisfied by executing the program /usr/local/apache/vhosts/10/20/30/40/cgi-bin/script.pl.
If you want to include the . character in a
VirtualDocumentRoot
directive, but it clashes with
a %
directive, you can work around the problem in
the following way:
VirtualDocumentRoot /usr/local/apache/vhosts/%2.0.%3.0
A request for http://www.example.isp.com/directory/file.html will be satisfied by the file /usr/local/apache/vhosts/example.isp/directory/file.html.
The LogFormat
directives %V
and
%A
are useful in conjunction with this module. See
Chapter 10.