You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by nd...@apache.org on 2002/12/22 16:24:57 UTC

cvs commit: httpd-2.0/docs/manual/howto cgi.html.en cgi.xml

nd          2002/12/22 07:24:57

  Modified:    docs/manual/howto Tag: APACHE_2_0_BRANCH cgi.html.en cgi.xml
  Log:
  backport of markup & formatting
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.6.2.2   +101 -113  httpd-2.0/docs/manual/howto/cgi.html.en
  
  Index: cgi.html.en
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/docs/manual/howto/cgi.html.en,v
  retrieving revision 1.6.2.1
  retrieving revision 1.6.2.2
  diff -u -r1.6.2.1 -r1.6.2.2
  --- cgi.html.en	11 Dec 2002 22:27:03 -0000	1.6.2.1
  +++ cgi.html.en	22 Dec 2002 15:24:57 -0000	1.6.2.2
  @@ -60,32 +60,29 @@
         it, when that particular resource is requested by a
         client.</p>
   
  -      <p>The 
  -      <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
  -
  +      <p>The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
         directive looks like:</p>
   
  -      <div class="example"><p><code>ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/</code></p></div>
  -
  -      <p>The example shown is from your default 
  -      <code>httpd.conf</code>
  +      <div class="example"><p><code>
  +        ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
  +      </code></p></div>
   
  +      <p>The example shown is from your default <code>httpd.conf</code>
         configuration file, if you installed Apache in the default
  -      location. The <code>ScriptAlias</code> directive is much like the 
  -      <code>Alias</code> directive, which defines a URL prefix that
  -      is to mapped to a particular directory.  <code>Alias</code>
  -      and <code>ScriptAlias</code> are usually used for directories 
  -      that are outside of the <code>DocumentRoot</code> directory. 
  -      The difference between <code>Alias</code> and 
  -      <code>ScriptAlias</code> is that <code>ScriptAlias</code>
  -      has the added meaning that everything under that URL prefix
  -      will be considered a CGI program. So, the example above tells
  -      Apache that any request for a resource beginning with 
  -      <code>/cgi-bin/</code> should be served from the directory 
  -      <code>/usr/local/apache/cgi-bin/</code>, and should be treated 
  -      as a CGI program.</p>
  +      location. The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
  +      directive is much like the <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> directive, which defines a URL prefix that
  +      is to mapped to a particular directory. <code class="directive">Alias</code>
  +      and <code class="directive">ScriptAlias</code> are usually used for
  +      directories that are outside of the <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> directory. The difference between
  +      <code class="directive">Alias</code> and <code class="directive">ScriptAlias</code>
  +      is that <code class="directive">ScriptAlias</code> has the added meaning
  +      that everything under that URL prefix will be considered a CGI
  +      program. So, the example above tells Apache that any request for a
  +      resource beginning with <code>/cgi-bin/</code> should be served from
  +      the directory  <code>/usr/local/apache/cgi-bin/</code>, and should be
  +      treated as a CGI program.</p>
   
  -      <p>For example, if the URL 
  +      <p>For example, if the URL
         <code>http://www.example.com/cgi-bin/test.pl</code>
         is requested, Apache will attempt to execute the file 
         <code>/usr/local/apache/cgi-bin/test.pl</code>
  @@ -97,66 +94,71 @@
       <h3><a name="nonscriptalias" id="nonscriptalias">CGI outside of ScriptAlias directories</a></h3>
         
   
  -      <p>CGI programs are often restricted to 
  -      <code>ScriptAlias</code>'ed directories for security reasons.
  -      In this way,
  -      administrators can tightly control who is allowed to use CGI
  -      programs. However, if the proper security precautions are
  +      <p>CGI programs are often restricted to <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>'ed directories for security reasons.
  +      In this way, administrators can tightly control who is allowed to
  +      use CGI programs. However, if the proper security precautions are
         taken, there is no reason why CGI programs cannot be run from
         arbitrary directories. For example, you may wish to let users
         have web content in their home directories with the 
  -      <code>UserDir</code> directive. If they want to have their own
  -      CGI programs, but don't have access to the main 
  -      <code>cgi-bin</code> directory, they will need to be able to
  +      <code class="directive"><a href="../mod/mod_userdir.html#userdir">UserDir</a></code> directive.
  +      If they want to have their own CGI programs, but don't have access to
  +      the main <code>cgi-bin</code> directory, they will need to be able to
         run CGI programs elsewhere.</p>
       
   
       <h3><a name="options" id="options">Explicitly using Options to permit CGI execution</a></h3>
         
   
  -      <p>You could explicitly use the <code>Options</code>
  -      directive, inside your main server configuration file, to
  -      specify that CGI execution was permitted in a particular
  +      <p>You could explicitly use the <code class="directive"><a href="../mod/core.html#options">Options</a></code> directive, inside your main server configuration
  +      file, to specify that CGI execution was permitted in a particular
         directory:</p>
   
  -      <div class="example"><p><code>&lt;Directory /usr/local/apache/htdocs/somedir&gt; <br />
  -      Options +ExecCGI<br />
  -      &lt;/Directory&gt;</code></p></div>
  +      <div class="example"><p><code>
  +        &lt;Directory /usr/local/apache/htdocs/somedir&gt;<br />
  +        <span class="indent">
  +          Options +ExecCGI<br />
  +        </span>
  +        &lt;/Directory&gt;
  +      </code></p></div>
   
         <p>The above directive tells Apache to permit the execution
         of CGI files. You will also need to tell the server what
  -      files are CGI files. The following 
  -      <code>AddHandler</code>
  -
  -      directive tells the server to treat all files with the 
  -      <code>cgi</code> or <code>pl</code> extension as CGI programs:</p>
  +      files are CGI files. The following <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> directive tells the server to treat all
  +      files with the <code>cgi</code> or <code>pl</code> extension as CGI
  +      programs:</p>
   
  -      <div class="example"><p><code>AddHandler cgi-script cgi pl</code></p></div>
  +      <div class="example"><p><code>
  +        AddHandler cgi-script cgi pl
  +      </code></p></div>
       
   
       <h3><a name="htaccess" id="htaccess">.htaccess files</a></h3>
         
   
  -      <p>A <code>.htaccess</code> file is a way to set configuration
  -      directives on a per-directory basis. When Apache serves a 
  -      resource, it looks in the directory from which it is serving
  +      <p>A <a href="htaccess.html"><code>.htaccess</code> file</a> is a way
  +      to set configuration directives on a per-directory basis. When Apache
  +      serves a resource, it looks in the directory from which it is serving
         a file for a file called <code>.htaccess</code>, and, if it 
         finds it, it will apply directives found therein.  
         
         <code>.htaccess</code> files can be permitted with the 
  -      <code>AllowOverride</code> directive, which specifies what 
  -      types of directives can
  +      <code class="directive"><a href="../mod/core.html#allowoverride">AllowOverride</a></code> directive,
  +      which specifies what types of directives can
         appear in these files, or if they are not allowed at all. To
         permit the directive we will need for this purpose, the
         following configuration will be needed in your main server
         configuration:</p>
   
  -      <div class="example"><p><code>AllowOverride Options</code></p></div>
  +      <div class="example"><p><code>
  +        AllowOverride Options
  +      </code></p></div>
   
         <p>In the <code>.htaccess</code> file, you'll need the 
         following directive:</p>
   
  -      <div class="example"><p><code>Options +ExecCGI</code></p></div>
  +      <div class="example"><p><code>
  +        Options +ExecCGI
  +      </code></p></div>
   
         <p>which tells Apache that execution of CGI programs is
         permitted in this directory.</p>
  @@ -174,7 +176,9 @@
       what sort of content it is receiving. Most of the time, this
       will look like:</p>
   
  -    <div class="example"><p><code>Content-type: text/html</code></p></div>
  +    <div class="example"><p><code>
  +      Content-type: text/html
  +    </code></p></div>
   
       <p>Secondly, your output needs to be in HTML, or some other
       format that a browser will be able to display. Most of the
  @@ -193,9 +197,10 @@
         file called <code>first.pl</code>, and put it in your 
         <code>cgi-bin</code> directory.</p>
   
  -      <div class="example"><p><code>#!/usr/bin/perl<br />
  -      print "Content-type: text/html\n\n";<br />
  -      print "Hello, World.";
  +      <div class="example"><p><code>
  +        #!/usr/bin/perl<br />
  +        print "Content-type: text/html\n\n";<br />
  +        print "Hello, World.";
         </code></p></div>
   
         <p>Even if you are not familiar with Perl, you should be able
  @@ -207,20 +212,20 @@
         talked about, followed by two carriage-return newline pairs.
         This puts a blank line after the header, to indicate the end
         of the HTTP headers, and the beginning of the body. The third
  -      line prints the string ``Hello, World.'' And that's the end
  +      line prints the string "Hello, World.". And that's the end
         of it.</p>
   
         <p>If you open your favorite browser and tell it to get the
         address</p>
   
  -      <div class="example"><p><code>http://www.example.com/cgi-bin/first.pl</code></p></div>
  +      <div class="example"><p><code>
  +        http://www.example.com/cgi-bin/first.pl
  +      </code></p></div>
   
         <p>or wherever you put your file, you will see the one line 
  -      <code>Hello, World.</code>
  -
  -      appear in your browser window. It's not very exciting, but
  -      once you get that working, you'll have a good chance of
  -      getting just about anything working.</p>
  +      <code>Hello, World.</code> appear in your browser window.
  +      It's not very exciting, but once you get that working, you'll
  +      have a good chance of getting just about anything working.</p>
       
     </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
   <div class="section">
  @@ -232,35 +237,21 @@
   
       <dl>
         <dt>The output of your CGI program</dt>
  -
  -      <dd>Great! That means everything worked fine.
  -      </dd>
  +      <dd>Great! That means everything worked fine.</dd>
   
         <dt>The source code of your CGI program or a "POST Method Not
         Allowed" message</dt>
  -
         <dd>That means that you have not properly configured Apache
         to process your CGI program. Reread the section on 
         <a href="#configuringapachetopermitcgi">configuring
  -      Apache</a>
  -
  -      and try to find what you missed.
  -      </dd>
  +      Apache</a> and try to find what you missed.</dd>
   
         <dt>A message starting with "Forbidden"</dt>
  -
         <dd>That means that there is a permissions problem. Check the
  -      
  -      <a href="#errorlogs">Apache error log</a>
  -
  -      and the section below on 
  -      <a href="#permissions">file permissions</a>.
  -
  -      <br />
  -      </dd>
  +      <a href="#errorlogs">Apache error log</a> and the section below on
  +      <a href="#permissions">file permissions</a>.</dd>
   
         <dt>A message saying "Internal Server Error"</dt>
  -
         <dd>If you check the 
         <a href="#errorlogs">Apache error log</a>, you will probably
         find that it says "Premature end of
  @@ -276,22 +267,23 @@
   
         <p>Remember that the server does not run as you. That is,
         when the server starts up, it is running with the permissions
  -      of an unprivileged user - usually ``nobody'', or ``www'' -
  -      and so it will need extra permissions to execute files that
  -      are owned by you. Usually, the way to give a file sufficient
  -      permissions to be executed by ``nobody'' is to give everyone
  -      execute permission on the file:</p>
  +      of an unprivileged user - usually <code>nobody</code>, or
  +      <code>www</code> - and so it will need extra permissions to
  +      execute files that are owned by you. Usually, the way to give
  +      a file sufficient permissions to be executed by <code>nobody</code>
  +      is to give everyone execute permission on the file:</p>
   
  -      <div class="example"><p><code>chmod a+x first.pl</code></p></div>
  +      <div class="example"><p><code>
  +        chmod a+x first.pl
  +      </code></p></div>
   
         <p>Also, if your program reads from, or writes to, any other
         files, those files will need to have the correct permissions
         to permit this.</p>
   
         <p>The exception to this is when the server is configured to
  -      use <a href="../suexec.html">suexec</a>.
  -
  -      This program allows CGI programs to be run under different
  +      use <a href="../suexec.html">suexec</a>. This program allows
  +      CGI programs to be run under different
         user permissions, depending on which virtual host or user
         home directory they are located in. Suexec has very strict
         permission checking, and any failure in that checking will
  @@ -319,7 +311,9 @@
         interpreter (often <code>perl</code>) indicated in the first
         line of your CGI program, which will look something like:</p>
   
  -      <div class="example"><p><code>#!/usr/bin/perl</code></p></div>
  +      <div class="example"><p><code>
  +        #!/usr/bin/perl
  +      </code></p></div>
   
         <p>Make sure that this is in fact the path to the
         interpreter.</p>
  @@ -356,7 +350,7 @@
       become useful to understand more about what's happening behind
       the scenes. Specifically, how the browser and server
       communicate with one another. Because although it's all very
  -    well to write a program that prints ``Hello, World.'', it's not
  +    well to write a program that prints "Hello, World.", it's not
       particularly useful.</p>
   
       <h3><a name="env" id="env">Environment variables</a></h3>
  @@ -379,9 +373,7 @@
         <p>These variables are available to the CGI programmer, and
         are half of the story of the client-server communication. The
         complete list of required variables is at 
  -      <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">
  -      http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>
  -      </p>
  +      <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>.</p>
   
         <p>This simple Perl CGI program will display all of the
         environment variables that are being passed around. Two
  @@ -393,15 +385,17 @@
         see some variables listed that were not in the official list.
         In addition, Apache provides many different ways for you to 
         <a href="../env.html">add your own environment variables</a>
  -
         to the basic ones provided by default.</p>
   
         <div class="example"><p><code>
  -      #!/usr/bin/perl<br />
  -      print "Content-type: text/html\n\n";<br />
  -      foreach $key (keys %ENV) {<br />
  -        print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
  -      }</code></p></div>
  +        #!/usr/bin/perl<br />
  +        print "Content-type: text/html\n\n";<br />
  +        foreach $key (keys %ENV) {<br />
  +        <span class="indent">
  +          print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
  +        </span>
  +        }
  +      </code></p></div>
       
   
       <h3><a name="stdin" id="stdin">STDIN and STDOUT</a></h3>
  @@ -420,7 +414,7 @@
         The program then can process that data as though it was
         coming in from the keyboard, or from a file</p>
   
  -      <p>The ``special format'' is very simple. A field name and
  +      <p>The "special format" is very simple. A field name and
         its value are joined together with an equals (=) sign, and
         pairs of values are joined together with an ampersand
         (&amp;). Inconvenient characters like spaces, ampersands, and
  @@ -429,7 +423,7 @@
         something like:</p>
   
         <div class="example"><p><code>
  -      name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
  +        name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
         </code></p></div>
   
         <p>You'll sometimes also see this type of string appended to
  @@ -456,14 +450,13 @@
   
       <p>If you're writing CGI programs in Perl, modules are
       available on <a href="http://www.cpan.org/">CPAN</a>. The most
  -    popular module for this purpose is CGI.pm. You might
  -    also consider CGI::Lite, which implements a minimal set of
  -    functionality, which is all you need in most programs.</p>
  +    popular module for this purpose is <code>CGI.pm</code>. You might
  +    also consider <code>CGI::Lite</code>, which implements a minimal
  +    set of functionality, which is all you need in most programs.</p>
   
       <p>If you're writing CGI programs in C, there are a variety of
  -    options. One of these is the CGIC library, from 
  -    <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>
  -    </p>
  +    options. One of these is the <code>CGIC</code> library, from 
  +    <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>.</p>
     </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
   <div class="section">
   <h2><a name="moreinfo" id="moreinfo">For more information</a></h2>
  @@ -471,20 +464,15 @@
   
       <p>There are a large number of CGI resources on the web. You
       can discuss CGI problems with other users on the Usenet group
  -    comp.infosystems.www.authoring.cgi. And the -servers mailing
  +    <a href="news:comp.infosystems.www.authoring.cgi">comp.infosystems.www.authoring.cgi</a>. And the -servers mailing
       list from the HTML Writers Guild is a great source of answers
       to your questions. You can find out more at 
  -    <a href="http://www.hwg.org/lists/hwg-servers/">
  -    http://www.hwg.org/lists/hwg-servers/</a>
  -    </p>
  +    <a href="http://www.hwg.org/lists/hwg-servers/">http://www.hwg.org/lists/hwg-servers/</a>.</p>
   
       <p>And, of course, you should probably read the CGI
       specification, which has all the details on the operation of
       CGI programs. You can find the original version at the 
  -    <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">
  -    NCSA</a>
  -
  -    and there is an updated draft at the 
  +    <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a> and there is an updated draft at the 
       <a href="http://web.golux.com/coar/cgi/">Common Gateway
       Interface RFC project</a>.</p>
   
  
  
  
  1.2.2.1   +111 -116  httpd-2.0/docs/manual/howto/cgi.xml
  
  Index: cgi.xml
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/docs/manual/howto/cgi.xml,v
  retrieving revision 1.2
  retrieving revision 1.2.2.1
  diff -u -r1.2 -r1.2.2.1
  --- cgi.xml	17 Nov 2002 06:28:39 -0000	1.2
  +++ cgi.xml	22 Dec 2002 15:24:57 -0000	1.2.2.1
  @@ -13,15 +13,12 @@
       <related>
         <modulelist>
           <module>mod_alias</module>
  -
           <module>mod_cgi</module>
         </modulelist>
   
         <directivelist>
           <directive module="mod_mime">AddHandler</directive>
  -
           <directive module="core">Options</directive>
  -
           <directive module="mod_alias">ScriptAlias</directive>
         </directivelist>
       </related>
  @@ -54,32 +51,31 @@
         it, when that particular resource is requested by a
         client.</p>
   
  -      <p>The 
  -      <directive module="mod_alias">ScriptAlias</directive>
  -
  +      <p>The <directive module="mod_alias">ScriptAlias</directive>
         directive looks like:</p>
   
  -      <example>ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/</example>
  -
  -      <p>The example shown is from your default 
  -      <code>httpd.conf</code>
  +      <example>
  +        ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
  +      </example>
   
  +      <p>The example shown is from your default <code>httpd.conf</code>
         configuration file, if you installed Apache in the default
  -      location. The <code>ScriptAlias</code> directive is much like the 
  -      <code>Alias</code> directive, which defines a URL prefix that
  -      is to mapped to a particular directory.  <code>Alias</code>
  -      and <code>ScriptAlias</code> are usually used for directories 
  -      that are outside of the <code>DocumentRoot</code> directory. 
  -      The difference between <code>Alias</code> and 
  -      <code>ScriptAlias</code> is that <code>ScriptAlias</code>
  -      has the added meaning that everything under that URL prefix
  -      will be considered a CGI program. So, the example above tells
  -      Apache that any request for a resource beginning with 
  -      <code>/cgi-bin/</code> should be served from the directory 
  -      <code>/usr/local/apache/cgi-bin/</code>, and should be treated 
  -      as a CGI program.</p>
  +      location. The <directive module="mod_alias">ScriptAlias</directive>
  +      directive is much like the <directive module="mod_alias"
  +      >Alias</directive> directive, which defines a URL prefix that
  +      is to mapped to a particular directory. <directive>Alias</directive>
  +      and <directive>ScriptAlias</directive> are usually used for
  +      directories that are outside of the <directive module="core"
  +      >DocumentRoot</directive> directory. The difference between
  +      <directive>Alias</directive> and <directive>ScriptAlias</directive>
  +      is that <directive>ScriptAlias</directive> has the added meaning
  +      that everything under that URL prefix will be considered a CGI
  +      program. So, the example above tells Apache that any request for a
  +      resource beginning with <code>/cgi-bin/</code> should be served from
  +      the directory  <code>/usr/local/apache/cgi-bin/</code>, and should be
  +      treated as a CGI program.</p>
   
  -      <p>For example, if the URL 
  +      <p>For example, if the URL
         <code>http://www.example.com/cgi-bin/test.pl</code>
         is requested, Apache will attempt to execute the file 
         <code>/usr/local/apache/cgi-bin/test.pl</code>
  @@ -91,66 +87,74 @@
       <section id="nonscriptalias">
         <title>CGI outside of ScriptAlias directories</title>
   
  -      <p>CGI programs are often restricted to 
  -      <code>ScriptAlias</code>'ed directories for security reasons.
  -      In this way,
  -      administrators can tightly control who is allowed to use CGI
  -      programs. However, if the proper security precautions are
  +      <p>CGI programs are often restricted to <directive module="mod_alias"
  +      >ScriptAlias</directive>'ed directories for security reasons.
  +      In this way, administrators can tightly control who is allowed to
  +      use CGI programs. However, if the proper security precautions are
         taken, there is no reason why CGI programs cannot be run from
         arbitrary directories. For example, you may wish to let users
         have web content in their home directories with the 
  -      <code>UserDir</code> directive. If they want to have their own
  -      CGI programs, but don't have access to the main 
  -      <code>cgi-bin</code> directory, they will need to be able to
  +      <directive module="mod_userdir">UserDir</directive> directive.
  +      If they want to have their own CGI programs, but don't have access to
  +      the main <code>cgi-bin</code> directory, they will need to be able to
         run CGI programs elsewhere.</p>
       </section>
   
       <section id="options">
         <title>Explicitly using Options to permit CGI execution</title>
   
  -      <p>You could explicitly use the <code>Options</code>
  -      directive, inside your main server configuration file, to
  -      specify that CGI execution was permitted in a particular
  +      <p>You could explicitly use the <directive module="core"
  +      >Options</directive> directive, inside your main server configuration
  +      file, to specify that CGI execution was permitted in a particular
         directory:</p>
   
  -      <example>&lt;Directory /usr/local/apache/htdocs/somedir&gt; <br />
  -      Options +ExecCGI<br />
  -      &lt;/Directory&gt;</example>
  +      <example>
  +        &lt;Directory /usr/local/apache/htdocs/somedir&gt;<br />
  +        <indent>
  +          Options +ExecCGI<br />
  +        </indent>
  +        &lt;/Directory&gt;
  +      </example>
   
         <p>The above directive tells Apache to permit the execution
         of CGI files. You will also need to tell the server what
  -      files are CGI files. The following 
  -      <code>AddHandler</code>
  -
  -      directive tells the server to treat all files with the 
  -      <code>cgi</code> or <code>pl</code> extension as CGI programs:</p>
  +      files are CGI files. The following <directive module="mod_mime"
  +      >AddHandler</directive> directive tells the server to treat all
  +      files with the <code>cgi</code> or <code>pl</code> extension as CGI
  +      programs:</p>
   
  -      <example>AddHandler cgi-script cgi pl</example>
  +      <example>
  +        AddHandler cgi-script cgi pl
  +      </example>
       </section>
   
       <section id="htaccess">
         <title>.htaccess files</title>
   
  -      <p>A <code>.htaccess</code> file is a way to set configuration
  -      directives on a per-directory basis. When Apache serves a 
  -      resource, it looks in the directory from which it is serving
  +      <p>A <a href="htaccess.html"><code>.htaccess</code> file</a> is a way
  +      to set configuration directives on a per-directory basis. When Apache
  +      serves a resource, it looks in the directory from which it is serving
         a file for a file called <code>.htaccess</code>, and, if it 
         finds it, it will apply directives found therein.  
         
         <code>.htaccess</code> files can be permitted with the 
  -      <code>AllowOverride</code> directive, which specifies what 
  -      types of directives can
  +      <directive module="core">AllowOverride</directive> directive,
  +      which specifies what types of directives can
         appear in these files, or if they are not allowed at all. To
         permit the directive we will need for this purpose, the
         following configuration will be needed in your main server
         configuration:</p>
   
  -      <example>AllowOverride Options</example>
  +      <example>
  +        AllowOverride Options
  +      </example>
   
         <p>In the <code>.htaccess</code> file, you'll need the 
         following directive:</p>
   
  -      <example>Options +ExecCGI</example>
  +      <example>
  +        Options +ExecCGI
  +      </example>
   
         <p>which tells Apache that execution of CGI programs is
         permitted in this directory.</p>
  @@ -168,7 +172,9 @@
       what sort of content it is receiving. Most of the time, this
       will look like:</p>
   
  -    <example>Content-type: text/html</example>
  +    <example>
  +      Content-type: text/html
  +    </example>
   
       <p>Secondly, your output needs to be in HTML, or some other
       format that a browser will be able to display. Most of the
  @@ -187,9 +193,10 @@
         file called <code>first.pl</code>, and put it in your 
         <code>cgi-bin</code> directory.</p>
   
  -      <example>#!/usr/bin/perl<br />
  -      print "Content-type: text/html\n\n";<br />
  -      print "Hello, World.";
  +      <example>
  +        #!/usr/bin/perl<br />
  +        print "Content-type: text/html\n\n";<br />
  +        print "Hello, World.";
         </example>
   
         <p>Even if you are not familiar with Perl, you should be able
  @@ -201,20 +208,20 @@
         talked about, followed by two carriage-return newline pairs.
         This puts a blank line after the header, to indicate the end
         of the HTTP headers, and the beginning of the body. The third
  -      line prints the string ``Hello, World.'' And that's the end
  +      line prints the string "Hello, World.". And that's the end
         of it.</p>
   
         <p>If you open your favorite browser and tell it to get the
         address</p>
   
  -      <example>http://www.example.com/cgi-bin/first.pl</example>
  +      <example>
  +        http://www.example.com/cgi-bin/first.pl
  +      </example>
   
         <p>or wherever you put your file, you will see the one line 
  -      <code>Hello, World.</code>
  -
  -      appear in your browser window. It's not very exciting, but
  -      once you get that working, you'll have a good chance of
  -      getting just about anything working.</p>
  +      <code>Hello, World.</code> appear in your browser window.
  +      It's not very exciting, but once you get that working, you'll
  +      have a good chance of getting just about anything working.</p>
       </section>
     </section>
   
  @@ -226,35 +233,21 @@
   
       <dl>
         <dt>The output of your CGI program</dt>
  -
  -      <dd>Great! That means everything worked fine.
  -      </dd>
  +      <dd>Great! That means everything worked fine.</dd>
   
         <dt>The source code of your CGI program or a "POST Method Not
         Allowed" message</dt>
  -
         <dd>That means that you have not properly configured Apache
         to process your CGI program. Reread the section on 
         <a href="#configuringapachetopermitcgi">configuring
  -      Apache</a>
  -
  -      and try to find what you missed.
  -      </dd>
  +      Apache</a> and try to find what you missed.</dd>
   
         <dt>A message starting with "Forbidden"</dt>
  -
         <dd>That means that there is a permissions problem. Check the
  -      
  -      <a href="#errorlogs">Apache error log</a>
  -
  -      and the section below on 
  -      <a href="#permissions">file permissions</a>.
  -
  -      <br />
  -      </dd>
  +      <a href="#errorlogs">Apache error log</a> and the section below on
  +      <a href="#permissions">file permissions</a>.</dd>
   
         <dt>A message saying "Internal Server Error"</dt>
  -
         <dd>If you check the 
         <a href="#errorlogs">Apache error log</a>, you will probably
         find that it says "Premature end of
  @@ -270,22 +263,23 @@
   
         <p>Remember that the server does not run as you. That is,
         when the server starts up, it is running with the permissions
  -      of an unprivileged user - usually ``nobody'', or ``www'' -
  -      and so it will need extra permissions to execute files that
  -      are owned by you. Usually, the way to give a file sufficient
  -      permissions to be executed by ``nobody'' is to give everyone
  -      execute permission on the file:</p>
  +      of an unprivileged user - usually <code>nobody</code>, or
  +      <code>www</code> - and so it will need extra permissions to
  +      execute files that are owned by you. Usually, the way to give
  +      a file sufficient permissions to be executed by <code>nobody</code>
  +      is to give everyone execute permission on the file:</p>
   
  -      <example>chmod a+x first.pl</example>
  +      <example>
  +        chmod a+x first.pl
  +      </example>
   
         <p>Also, if your program reads from, or writes to, any other
         files, those files will need to have the correct permissions
         to permit this.</p>
   
         <p>The exception to this is when the server is configured to
  -      use <a href="../suexec.html">suexec</a>.
  -
  -      This program allows CGI programs to be run under different
  +      use <a href="../suexec.html">suexec</a>. This program allows
  +      CGI programs to be run under different
         user permissions, depending on which virtual host or user
         home directory they are located in. Suexec has very strict
         permission checking, and any failure in that checking will
  @@ -313,7 +307,9 @@
         interpreter (often <code>perl</code>) indicated in the first
         line of your CGI program, which will look something like:</p>
   
  -      <example>#!/usr/bin/perl</example>
  +      <example>
  +        #!/usr/bin/perl
  +      </example>
   
         <p>Make sure that this is in fact the path to the
         interpreter.</p>
  @@ -350,7 +346,7 @@
       become useful to understand more about what's happening behind
       the scenes. Specifically, how the browser and server
       communicate with one another. Because although it's all very
  -    well to write a program that prints ``Hello, World.'', it's not
  +    well to write a program that prints "Hello, World.", it's not
       particularly useful.</p>
   
       <section id="env">
  @@ -373,9 +369,8 @@
         <p>These variables are available to the CGI programmer, and
         are half of the story of the client-server communication. The
         complete list of required variables is at 
  -      <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">
  -      http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>
  -      </p>
  +      <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html"
  +      >http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>.</p>
   
         <p>This simple Perl CGI program will display all of the
         environment variables that are being passed around. Two
  @@ -387,15 +382,17 @@
         see some variables listed that were not in the official list.
         In addition, Apache provides many different ways for you to 
         <a href="../env.html">add your own environment variables</a>
  -
         to the basic ones provided by default.</p>
   
         <example>
  -      #!/usr/bin/perl<br />
  -      print "Content-type: text/html\n\n";<br />
  -      foreach $key (keys %ENV) {<br />
  -        print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
  -      }</example>
  +        #!/usr/bin/perl<br />
  +        print "Content-type: text/html\n\n";<br />
  +        foreach $key (keys %ENV) {<br />
  +        <indent>
  +          print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
  +        </indent>
  +        }
  +      </example>
       </section>
   
       <section id="stdin">
  @@ -414,7 +411,7 @@
         The program then can process that data as though it was
         coming in from the keyboard, or from a file</p>
   
  -      <p>The ``special format'' is very simple. A field name and
  +      <p>The "special format" is very simple. A field name and
         its value are joined together with an equals (=) sign, and
         pairs of values are joined together with an ampersand
         (&amp;). Inconvenient characters like spaces, ampersands, and
  @@ -423,7 +420,7 @@
         something like:</p>
   
         <example>
  -      name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
  +        name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
         </example>
   
         <p>You'll sometimes also see this type of string appended to
  @@ -450,14 +447,14 @@
   
       <p>If you're writing CGI programs in Perl, modules are
       available on <a href="http://www.cpan.org/">CPAN</a>. The most
  -    popular module for this purpose is CGI.pm. You might
  -    also consider CGI::Lite, which implements a minimal set of
  -    functionality, which is all you need in most programs.</p>
  +    popular module for this purpose is <code>CGI.pm</code>. You might
  +    also consider <code>CGI::Lite</code>, which implements a minimal
  +    set of functionality, which is all you need in most programs.</p>
   
       <p>If you're writing CGI programs in C, there are a variety of
  -    options. One of these is the CGIC library, from 
  -    <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>
  -    </p>
  +    options. One of these is the <code>CGIC</code> library, from 
  +    <a href="http://www.boutell.com/cgic/"
  +    >http://www.boutell.com/cgic/</a>.</p>
     </section>
   
     <section id="moreinfo">
  @@ -465,20 +462,18 @@
   
       <p>There are a large number of CGI resources on the web. You
       can discuss CGI problems with other users on the Usenet group
  -    comp.infosystems.www.authoring.cgi. And the -servers mailing
  +    <a href="news:comp.infosystems.www.authoring.cgi"
  +    >comp.infosystems.www.authoring.cgi</a>. And the -servers mailing
       list from the HTML Writers Guild is a great source of answers
       to your questions. You can find out more at 
  -    <a href="http://www.hwg.org/lists/hwg-servers/">
  -    http://www.hwg.org/lists/hwg-servers/</a>
  -    </p>
  +    <a href="http://www.hwg.org/lists/hwg-servers/"
  +    >http://www.hwg.org/lists/hwg-servers/</a>.</p>
   
       <p>And, of course, you should probably read the CGI
       specification, which has all the details on the operation of
       CGI programs. You can find the original version at the 
  -    <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">
  -    NCSA</a>
  -
  -    and there is an updated draft at the 
  +    <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html"
  +    >NCSA</a> and there is an updated draft at the 
       <a href="http://web.golux.com/coar/cgi/">Common Gateway
       Interface RFC project</a>.</p>