Apache 1.3.6 Released
=====================

The Apache Group is pleased to announce the release of version
1.3.6 of the Apache HTTP server.

This new Apache version incorporates over 60 significant improvements
to the server.  Apart from portability and security fixes, documentation
enhancements, performance improvements, and assorted other minor
features or fixes notable changes are:

 - mod_log_config now supports conditional logging based upon
   environment variables and support for multiline entries.

 - New CustomLog directive %V: This logs the hostname according to the
   UseCanonicalName setting (this is the pre-1.3.4 behaviour of %v).

 - Enhanced mod_rewrite's mapfile handling: The in-core cache for text
   and DBM format mapfiles now uses a hash table with LRU functionality.
   Furthermore map lookups for non-existent keys are now cached as well.
   The changes drastically improve the performance when large rewrite
   maps are in use.

 - Ability to handle DES or MD5 authentication passwords.
 
 - New <LimitExcept> directive to allow the user to assign authentication
   control to any HTTP method that is *not* given in the argument list;
   i.e., the logical negation of the <Limit> directive.
 
 - Improved content negotiation.
 
 - New ScriptInterpreterSource directive to enable searching the
   Win32 registry for script interpreters.
 
 - The FAQ document was reorganised.
 
 - Overhauled ApacheBench benchmark program.
 
 - Several new API functions have been added.

A complete listing with detailed descriptions is provided in the
src/CHANGES file.

We consider Apache 1.3.6 to be the best version of Apache available and
we strongly recommend that users of older versions, especially of the
1.1.x and 1.2.x family, upgrade as soon as possible.  No further releases
will be made in the 1.2.x family.


Apache 1.3.6 is available for download from

    http://www.apache.org/dist/

Please see the CHANGES_1.3 file in the same directory for a full
list of changes.

Binary distributions are available from

   http://www.apache.org/dist/binaries/

As of Apache 1.3.6 binary distributions contain all standard Apache
modules as shared objects (if supported by the platform) and include
full source code.  Installation is easily done by executing the
included install script.  See the README.bindist and INSTALL.bindist
files for a complete explanation.  Please note that the binary
distributions are only provided for your convenience and current
distributions for specific platforms are not always available.

The source and binary distributions are also available via any of the
mirrors listed at

    http://www.apache.org/mirrors/

For an overview of new features in 1.3 please see

    http://www.apache.org/docs/new_features_1_3.html

In general, Apache 1.3 offers several substantial improvements
over version 1.2, including better performance, reliability and a
wider range of supported platforms, including Windows 95/98 and NT
(which fall under the "Win32" label).

Apache is the most popular web server in the known universe; over
half of the servers on the Internet are running Apache or one of
its variants.

IMPORTANT NOTE FOR WIN32 USERS: Over the years, many users have
come to trust Apache as a secure and stable server.  It must
be realized that the current Win32 code has not yet reached these
levels and should still be considered to be of beta quality.  Any
Win32 stability or security problems do not impact, in any way,
Apache on other platforms.  With the continued donation of time
and resources by individuals and companies, we hope that the Win32
version of Apache will grow stronger through the 1.3.x release cycle.

