                                 Apache
                          Version 1.3 (and up)

  What is it?
  -----------

  Apache is an HTTP server, originally designed for Unix systems. This
  is the version of Apache for Microsoft Windows 2000, NT, 98, and 95
  systems.  Like the Unix version, it includes many frequently
  requested new features, and has an API that allows it to be extended
  to meet users' needs more easily. It also allows limited support for
  ISAPI extensions.


  The Latest Version
  ------------------

  Details of the latest version can be found on the Apache HTTP
  server project page under http://httpd.apache.org/.

  Documentation
  -------------

  The documentation available as of the date of this release is
  also included, in HTML format, in the htdocs/manual/ directory.
  For the most up-to-date documentation can be found on
  http://httpd.apache.org/docs/. For Windows specific information, see
  http://httpd.apache.org/docs/windows.html.

  WARNING
  -------

  Apache should never be used as a production server under any 
  consumer operating system such as Windows 95, 98, or ME (Millennium 
  Edition).  Only Windows NT 4.0 or 2000 should be considered, and only
  with appropriate NTFS file system and user security administration.
  Apache runs on these consumer Windows environments only to 
  provide test, development or trusted intranet server platforms.

  Apache on Win32 should be considered initial-release quality code.  
  It has not been subjected to the same stresses on its stability and 
  security that the Unix releases have enjoyed, so there is a greater 
  possibility of undiscovered vulnerabilities to stability or security
  of the Win32 port.  

  Apache performs best, and is still most reliable on Unix platforms.
  Over time the performance, reliability and security for the Apache
  Win32 port has improved, and continues to improve.  Folks doing 
  comparative reviews of webserver performance are still asked to 
  compare against Apache running on a Unix platform such as 
  Solaris, FreeBSD, or Linux.

  The Win32 code for Apache 2.0 has been entirely revised and large 
  segments have been rewritten from scratch.  Once the Apache 2.0 
  server is released, we strongly encourage all Win32 users to move to 
  that platform for increased stability and security.

  Installation
  ------------

  See the http://httpd.apache.org/docs/windows.html for details of how
  to install, configure and run Apache.  These documents are also 
  accessable from the "Documentation" program group listed within the 
  "Apache Web Server" Start Menu programs group created by the full 
  Apache Win32 program installer.

  Known Problems
  --------------

  To get information about the current set of known problems, see the
  online bug reporting database at

      http://www.apache.org/bug_report.html

  Bugs which affect Apache on Windows and not Apache on Unix can be 
  found under the category "os-windows".

  Do not report configuration problems to this database.  Please first
  research the problem you are experiencing on the newsgroup
  news:comp.infosystems.www.servers.ms-windows and search the bugs
  database before posting a bug report.

  Licensing
  ---------

  Please see the file called LICENSE.

  Acknowledgments
  ----------------

  We wish to acknowledge the following copyrighted works that
  make up portions of the Apache software:

  Portions of this software were developed at the National Center
  for Supercomputing Applications (NCSA) at the University of
  Illinois at Urbana-Champaign.

  This software contains code derived from the RSA Data Security
  Inc. MD5 Message-Digest Algorithm, including various
  modifications by Spyglass Inc., Carnegie Mellon University, and
  Bell Communications Research, Inc (Bellcore).

  This package contains software written and copyrighted by Henry
  Spencer.  Please see the file called src/regex/COPYRIGHT. 

  The NT port was started with code provided to the Apache Group
  by Ambarish Malpani of ValiCert, Inc. (http://www.valicert.com/).


