~ubuntu-branches/ubuntu/feisty/apache2/feisty-updates

« back to all changes in this revision

Viewing changes to docs/manual/howto/cgi.html.en

  • Committer: Bazaar Package Importer
  • Author(s): Andreas Barth
  • Date: 2006-12-09 21:05:45 UTC
  • mfrom: (0.6.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20061209210545-h70s0xaqc2v8vqr2
Tags: 2.2.3-3.2
* Non-maintainer upload.
* 043_ajp_connection_reuse: Patch from upstream Bugzilla, fixing a critical
  issue with regard to connection reuse in mod_proxy_ajp.
  Closes: #396265

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?xml version="1.0" encoding="ISO-8859-1"?>
 
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
3
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
 
4
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
5
              This file is generated from xml source: DO NOT EDIT
 
6
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
7
      -->
 
8
<title>Apache Tutorial: Dynamic Content with CGI - Apache HTTP Server</title>
 
9
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
 
10
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
 
11
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
 
12
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
 
13
<body id="manual-page"><div id="page-header">
 
14
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
 
15
<p class="apache">Apache HTTP Server Version 2.2</p>
 
16
<img alt="" src="../images/feather.gif" /></div>
 
17
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
 
18
<div id="path">
 
19
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.2</a> &gt; <a href="./">How-To / Tutorials</a></div><div id="page-content"><div id="preamble"><h1>Apache Tutorial: Dynamic Content with CGI</h1>
 
20
<div class="toplang">
 
21
<p><span>Available Languages: </span><a href="../en/howto/cgi.html" title="English">&nbsp;en&nbsp;</a> |
 
22
<a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
 
23
<a href="../ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
 
24
</div>
 
25
</div>
 
26
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#intro">Introduction</a></li>
 
27
<li><img alt="" src="../images/down.gif" /> <a href="#configuring">Configuring Apache to permit CGI</a></li>
 
28
<li><img alt="" src="../images/down.gif" /> <a href="#writing">Writing a CGI program</a></li>
 
29
<li><img alt="" src="../images/down.gif" /> <a href="#troubleshoot">But it's still not working!</a></li>
 
30
<li><img alt="" src="../images/down.gif" /> <a href="#behindscenes">What's going on behind the scenes?</a></li>
 
31
<li><img alt="" src="../images/down.gif" /> <a href="#libraries">CGI modules/libraries</a></li>
 
32
<li><img alt="" src="../images/down.gif" /> <a href="#moreinfo">For more information</a></li>
 
33
</ul></div>
 
34
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 
35
<div class="section">
 
36
<h2><a name="intro" id="intro">Introduction</a></h2>
 
37
    
 
38
 
 
39
    <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><li><code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code></li><li><code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code></li></ul></td><td><ul><li><code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code></li><li><code class="directive"><a href="../mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code></li></ul></td></tr></table>
 
40
 
 
41
    <p>The CGI (Common Gateway Interface) defines a way for a web
 
42
    server to interact with external content-generating programs,
 
43
    which are often referred to as CGI programs or CGI scripts. It
 
44
    is the simplest, and most common, way to put dynamic content on
 
45
    your web site. This document will be an introduction to setting
 
46
    up CGI on your Apache web server, and getting started writing
 
47
    CGI programs.</p>
 
48
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 
49
<div class="section">
 
50
<h2><a name="configuring" id="configuring">Configuring Apache to permit CGI</a></h2>
 
51
    
 
52
 
 
53
    <p>In order to get your CGI programs to work properly, you'll
 
54
    need to have Apache configured to permit CGI execution. There
 
55
    are several ways to do this.</p>
 
56
 
 
57
    <h3><a name="scriptalias" id="scriptalias">ScriptAlias</a></h3>
 
58
      
 
59
 
 
60
      <p>The 
 
61
      <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
 
62
 
 
63
      directive tells Apache that a particular directory is set
 
64
      aside for CGI programs. Apache will assume that every file in
 
65
      this directory is a CGI program, and will attempt to execute
 
66
      it, when that particular resource is requested by a
 
67
      client.</p>
 
68
 
 
69
      <p>The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
 
70
      directive looks like:</p>
 
71
 
 
72
      <div class="example"><p><code>
 
73
        ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
 
74
      </code></p></div>
 
75
 
 
76
      <p>The example shown is from your default <code>httpd.conf</code>
 
77
      configuration file, if you installed Apache in the default
 
78
      location. The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
 
79
      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
 
80
      is to mapped to a particular directory. <code class="directive">Alias</code>
 
81
      and <code class="directive">ScriptAlias</code> are usually used for
 
82
      directories that are outside of the <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> directory. The difference between
 
83
      <code class="directive">Alias</code> and <code class="directive">ScriptAlias</code>
 
84
      is that <code class="directive">ScriptAlias</code> has the added meaning
 
85
      that everything under that URL prefix will be considered a CGI
 
86
      program. So, the example above tells Apache that any request for a
 
87
      resource beginning with <code>/cgi-bin/</code> should be served from
 
88
      the directory  <code>/usr/local/apache2/cgi-bin/</code>, and should be
 
89
      treated as a CGI program.</p>
 
90
 
 
91
      <p>For example, if the URL
 
92
      <code>http://www.example.com/cgi-bin/test.pl</code>
 
93
      is requested, Apache will attempt to execute the file 
 
94
      <code>/usr/local/apache2/cgi-bin/test.pl</code>
 
95
      and return the output. Of course, the file will have to
 
96
      exist, and be executable, and return output in a particular
 
97
      way, or Apache will return an error message.</p>
 
98
    
 
99
 
 
100
    <h3><a name="nonscriptalias" id="nonscriptalias">CGI outside of ScriptAlias directories</a></h3>
 
101
      
 
102
 
 
103
      <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.
 
104
      In this way, administrators can tightly control who is allowed to
 
105
      use CGI programs. However, if the proper security precautions are
 
106
      taken, there is no reason why CGI programs cannot be run from
 
107
      arbitrary directories. For example, you may wish to let users
 
108
      have web content in their home directories with the 
 
109
      <code class="directive"><a href="../mod/mod_userdir.html#userdir">UserDir</a></code> directive.
 
110
      If they want to have their own CGI programs, but don't have access to
 
111
      the main <code>cgi-bin</code> directory, they will need to be able to
 
112
      run CGI programs elsewhere.</p>
 
113
 
 
114
      <p>There are two steps to allowing CGI execution in an arbitrary
 
115
      directory.  First, the <code>cgi-script</code> handler must be
 
116
      activated using the <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> or <code class="directive"><a href="../mod/core.html#sethandler">SetHandler</a></code> directive.  Second,
 
117
      <code>ExecCGI</code> must be specified in the <code class="directive"><a href="../mod/core.html#options">Options</a></code> directive.</p> 
 
118
    
 
119
 
 
120
    <h3><a name="options" id="options">Explicitly using Options to permit CGI execution</a></h3>
 
121
      
 
122
 
 
123
      <p>You could explicitly use the <code class="directive"><a href="../mod/core.html#options">Options</a></code> directive, inside your main server configuration
 
124
      file, to specify that CGI execution was permitted in a particular
 
125
      directory:</p>
 
126
 
 
127
      <div class="example"><p><code>
 
128
        &lt;Directory /usr/local/apache2/htdocs/somedir&gt;<br />
 
129
        <span class="indent">
 
130
          Options +ExecCGI<br />
 
131
        </span>
 
132
        &lt;/Directory&gt;
 
133
      </code></p></div>
 
134
 
 
135
      <p>The above directive tells Apache to permit the execution
 
136
      of CGI files. You will also need to tell the server what
 
137
      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
 
138
      files with the <code>cgi</code> or <code>pl</code> extension as CGI
 
139
      programs:</p>
 
140
 
 
141
      <div class="example"><p><code>
 
142
        AddHandler cgi-script .cgi .pl
 
143
      </code></p></div>
 
144
    
 
145
 
 
146
    <h3><a name="htaccess" id="htaccess">.htaccess files</a></h3>
 
147
      
 
148
 
 
149
      <p>The <a href="htaccess.html"><code>.htaccess</code> tutorial</a>
 
150
      shows how to activate CGI programs if you do not have
 
151
      access to <code>httpd.conf</code>.</p>
 
152
    
 
153
 
 
154
    <h3><a name="userdir" id="userdir">User Directories</a></h3>
 
155
      
 
156
 
 
157
      <p>To allow CGI program execution for any file ending in
 
158
      <code>.cgi</code> in users' directories, you can use the
 
159
      following configuration.</p>
 
160
 
 
161
      <div class="example"><p><code>
 
162
      &lt;Directory /home/*/public_html&gt;<br />
 
163
      <span class="indent">
 
164
        Options +ExecCGI<br />
 
165
        AddHandler cgi-script .cgi<br />
 
166
      </span>
 
167
      &lt;/Directory&gt;
 
168
      </code></p></div>
 
169
 
 
170
      <p>If you wish designate a <code>cgi-bin</code> subdirectory of
 
171
      a user's directory where everything will be treated as a CGI
 
172
      program, you can use the following.</p>
 
173
 
 
174
      <div class="example"><p><code>
 
175
      &lt;Directory /home/*/public_html/cgi-bin&gt;<br />
 
176
      <span class="indent">
 
177
        Options ExecCGI<br />
 
178
        SetHandler cgi-script<br />
 
179
      </span>
 
180
      &lt;/Directory&gt;
 
181
      </code></p></div>
 
182
 
 
183
    
 
184
 
 
185
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 
186
<div class="section">
 
187
<h2><a name="writing" id="writing">Writing a CGI program</a></h2>
 
188
    
 
189
 
 
190
    <p>There are two main differences between ``regular''
 
191
    programming, and CGI programming.</p>
 
192
 
 
193
    <p>First, all output from your CGI program must be preceded by
 
194
    a <a class="glossarylink" href="../glossary.html#mime-type" title="see glossary">MIME-type</a> header. This is HTTP header that tells the client
 
195
    what sort of content it is receiving. Most of the time, this
 
196
    will look like:</p>
 
197
 
 
198
    <div class="example"><p><code>
 
199
      Content-type: text/html
 
200
    </code></p></div>
 
201
 
 
202
    <p>Secondly, your output needs to be in HTML, or some other
 
203
    format that a browser will be able to display. Most of the
 
204
    time, this will be HTML, but occasionally you might write a CGI
 
205
    program that outputs a gif image, or other non-HTML
 
206
    content.</p>
 
207
 
 
208
    <p>Apart from those two things, writing a CGI program will look
 
209
    a lot like any other program that you might write.</p>
 
210
 
 
211
    <h3><a name="firstcgi" id="firstcgi">Your first CGI program</a></h3>
 
212
      
 
213
 
 
214
      <p>The following is an example CGI program that prints one
 
215
      line to your browser. Type in the following, save it to a
 
216
      file called <code>first.pl</code>, and put it in your 
 
217
      <code>cgi-bin</code> directory.</p>
 
218
 
 
219
      <div class="example"><p><code>
 
220
        #!/usr/bin/perl<br />
 
221
        print "Content-type: text/html\n\n";<br />
 
222
        print "Hello, World.";
 
223
      </code></p></div>
 
224
 
 
225
      <p>Even if you are not familiar with Perl, you should be able
 
226
      to see what is happening here. The first line tells Apache
 
227
      (or whatever shell you happen to be running under) that this
 
228
      program can be executed by feeding the file to the
 
229
      interpreter found at the location <code>/usr/bin/perl</code>.
 
230
      The second line prints the content-type declaration we
 
231
      talked about, followed by two carriage-return newline pairs.
 
232
      This puts a blank line after the header, to indicate the end
 
233
      of the HTTP headers, and the beginning of the body. The third
 
234
      line prints the string "Hello, World.". And that's the end
 
235
      of it.</p>
 
236
 
 
237
      <p>If you open your favorite browser and tell it to get the
 
238
      address</p>
 
239
 
 
240
      <div class="example"><p><code>
 
241
        http://www.example.com/cgi-bin/first.pl
 
242
      </code></p></div>
 
243
 
 
244
      <p>or wherever you put your file, you will see the one line 
 
245
      <code>Hello, World.</code> appear in your browser window.
 
246
      It's not very exciting, but once you get that working, you'll
 
247
      have a good chance of getting just about anything working.</p>
 
248
    
 
249
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 
250
<div class="section">
 
251
<h2><a name="troubleshoot" id="troubleshoot">But it's still not working!</a></h2>
 
252
    
 
253
 
 
254
    <p>There are four basic things that you may see in your browser
 
255
    when you try to access your CGI program from the web:</p>
 
256
 
 
257
    <dl>
 
258
      <dt>The output of your CGI program</dt>
 
259
      <dd>Great! That means everything worked fine.  If the output is correct,
 
260
      but the browser is not processing it correctly, make sure you have the
 
261
      correct <code>Content-Type</code> set in your CGI program.</dd>
 
262
 
 
263
      <dt>The source code of your CGI program or a "POST Method Not
 
264
      Allowed" message</dt>
 
265
      <dd>That means that you have not properly configured Apache
 
266
      to process your CGI program. Reread the section on 
 
267
      <a href="#configuring">configuring
 
268
      Apache</a> and try to find what you missed.</dd>
 
269
 
 
270
      <dt>A message starting with "Forbidden"</dt>
 
271
      <dd>That means that there is a permissions problem. Check the
 
272
      <a href="#errorlogs">Apache error log</a> and the section below on
 
273
      <a href="#permissions">file permissions</a>.</dd>
 
274
 
 
275
      <dt>A message saying "Internal Server Error"</dt>
 
276
      <dd>If you check the 
 
277
      <a href="#errorlogs">Apache error log</a>, you will probably
 
278
      find that it says "Premature end of
 
279
      script headers", possibly along with an error message
 
280
      generated by your CGI program. In this case, you will want to
 
281
      check each of the below sections to see what might be
 
282
      preventing your CGI program from emitting the proper HTTP
 
283
      headers.</dd>
 
284
    </dl>
 
285
 
 
286
    <h3><a name="permissions" id="permissions">File permissions</a></h3>
 
287
      
 
288
 
 
289
      <p>Remember that the server does not run as you. That is,
 
290
      when the server starts up, it is running with the permissions
 
291
      of an unprivileged user - usually <code>nobody</code>, or
 
292
      <code>www</code> - and so it will need extra permissions to
 
293
      execute files that are owned by you. Usually, the way to give
 
294
      a file sufficient permissions to be executed by <code>nobody</code>
 
295
      is to give everyone execute permission on the file:</p>
 
296
 
 
297
      <div class="example"><p><code>
 
298
        chmod a+x first.pl
 
299
      </code></p></div>
 
300
 
 
301
      <p>Also, if your program reads from, or writes to, any other
 
302
      files, those files will need to have the correct permissions
 
303
      to permit this.</p>
 
304
 
 
305
    
 
306
 
 
307
    <h3><a name="pathinformation" id="pathinformation">Path information and environment</a></h3>
 
308
      
 
309
 
 
310
      <p>When you run a program from your command line, you have
 
311
      certain information that is passed to the shell without you
 
312
      thinking about it. For example, you have a <code>PATH</code>,
 
313
      which tells the shell where it can look for files that you
 
314
      reference.</p>
 
315
 
 
316
      <p>When a program runs through the web server as a CGI program,
 
317
      it may not have the same <code>PATH</code>. Any programs that you
 
318
      invoke in your CGI program (like <code>sendmail</code>, for
 
319
      example) will need to be specified by a full path, so that the
 
320
      shell can find them when it attempts to execute your CGI
 
321
      program.</p>
 
322
 
 
323
      <p>A common manifestation of this is the path to the script
 
324
      interpreter (often <code>perl</code>) indicated in the first
 
325
      line of your CGI program, which will look something like:</p>
 
326
 
 
327
      <div class="example"><p><code>
 
328
        #!/usr/bin/perl
 
329
      </code></p></div>
 
330
 
 
331
      <p>Make sure that this is in fact the path to the
 
332
      interpreter.</p>
 
333
 
 
334
      <p>In addition, if your CGI program depends on other <a href="#env">environment variables</a>, you will need to
 
335
      assure that those variables are passed by Apache.</p>
 
336
 
 
337
    
 
338
 
 
339
    <h3><a name="syntaxerrors" id="syntaxerrors">Program errors</a></h3>
 
340
      
 
341
 
 
342
      <p>Most of the time when a CGI program fails, it's because of
 
343
      a problem with the program itself. This is particularly true
 
344
      once you get the hang of this CGI stuff, and no longer make
 
345
      the above two mistakes.  The first thing to do is to make
 
346
      sure that your program runs from the command line before
 
347
      testing it via the web server.  For example, try:</p>
 
348
 
 
349
      <div class="example"><p><code>
 
350
      cd /usr/local/apache2/cgi-bin<br />
 
351
      ./first.pl
 
352
      </code></p></div>
 
353
 
 
354
      <p>(Do not call the <code>perl</code> interpreter.  The shell
 
355
      and Apache should find the interpreter using the <a href="#pathinformation">path information</a> on the first line of
 
356
      the script.)</p>
 
357
 
 
358
      <p>The first thing you see written by your program should be
 
359
      a set of HTTP headers, including the <code>Content-Type</code>,
 
360
      followed by a blank line.  If you see anything else, Apache will
 
361
      return the <code>Premature end of script headers</code> error if
 
362
      you try to run it through the server. See <a href="#writing">Writing a CGI program</a> above for more
 
363
      details.</p>
 
364
    
 
365
 
 
366
    <h3><a name="errorlogs" id="errorlogs">Error logs</a></h3>
 
367
      
 
368
 
 
369
      <p>The error logs are your friend. Anything that goes wrong
 
370
      generates message in the error log. You should always look
 
371
      there first. If the place where you are hosting your web site
 
372
      does not permit you access to the error log, you should
 
373
      probably host your site somewhere else. Learn to read the
 
374
      error logs, and you'll find that almost all of your problems
 
375
      are quickly identified, and quickly solved.</p>
 
376
    
 
377
 
 
378
    <h3><a name="suexec" id="suexec">Suexec</a></h3>
 
379
      
 
380
 
 
381
      <p>The <a href="../suexec.html">suexec</a> support program
 
382
      allows CGI programs to be run under different user permissions,
 
383
      depending on which virtual host or user home directory they are
 
384
      located in. Suexec has very strict permission checking, and any
 
385
      failure in that checking will result in your CGI programs
 
386
      failing with <code>Premature end of script headers</code>.</p>
 
387
 
 
388
      <p>To check if you are using suexec, run <code>apachectl
 
389
      -V</code> and check for the location of <code>SUEXEC_BIN</code>.
 
390
      If Apache finds an <code class="program"><a href="../programs/suexec.html">suexec</a></code> binary there on startup,
 
391
      suexec will be activated.</p>
 
392
 
 
393
      <p>Unless you fully understand suexec, you should not be using it.
 
394
      To disable suexec, simply remove (or rename) the <code class="program"><a href="../programs/suexec.html">suexec</a></code>
 
395
      binary pointed to by <code>SUEXEC_BIN</code> and then restart the
 
396
      server.  If, after reading about <a href="../suexec.html">suexec</a>,
 
397
      you still wish to use it, then run <code>suexec -V</code> to find
 
398
      the location of the suexec log file, and use that log file to
 
399
      find what policy you are violating.</p>
 
400
    
 
401
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 
402
<div class="section">
 
403
<h2><a name="behindscenes" id="behindscenes">What's going on behind the scenes?</a></h2>
 
404
    
 
405
 
 
406
    <p>As you become more advanced in CGI programming, it will
 
407
    become useful to understand more about what's happening behind
 
408
    the scenes. Specifically, how the browser and server
 
409
    communicate with one another. Because although it's all very
 
410
    well to write a program that prints "Hello, World.", it's not
 
411
    particularly useful.</p>
 
412
 
 
413
    <h3><a name="env" id="env">Environment variables</a></h3>
 
414
      
 
415
 
 
416
      <p>Environment variables are values that float around you as
 
417
      you use your computer. They are useful things like your path
 
418
      (where the computer searches for the actual file
 
419
      implementing a command when you type it), your username, your
 
420
      terminal type, and so on. For a full list of your normal,
 
421
      every day environment variables, type 
 
422
      <code>env</code> at a command prompt.</p>
 
423
 
 
424
      <p>During the CGI transaction, the server and the browser
 
425
      also set environment variables, so that they can communicate
 
426
      with one another. These are things like the browser type
 
427
      (Netscape, IE, Lynx), the server type (Apache, IIS, WebSite),
 
428
      the name of the CGI program that is being run, and so on.</p>
 
429
 
 
430
      <p>These variables are available to the CGI programmer, and
 
431
      are half of the story of the client-server communication. The
 
432
      complete list of required variables is at 
 
433
      <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>.</p>
 
434
 
 
435
      <p>This simple Perl CGI program will display all of the
 
436
      environment variables that are being passed around. Two
 
437
      similar programs are included in the 
 
438
      <code>cgi-bin</code>
 
439
 
 
440
      directory of the Apache distribution. Note that some
 
441
      variables are required, while others are optional, so you may
 
442
      see some variables listed that were not in the official list.
 
443
      In addition, Apache provides many different ways for you to 
 
444
      <a href="../env.html">add your own environment variables</a>
 
445
      to the basic ones provided by default.</p>
 
446
 
 
447
      <div class="example"><p><code>
 
448
        #!/usr/bin/perl<br />
 
449
        print "Content-type: text/html\n\n";<br />
 
450
        foreach $key (keys %ENV) {<br />
 
451
        <span class="indent">
 
452
          print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
 
453
        </span>
 
454
        }
 
455
      </code></p></div>
 
456
    
 
457
 
 
458
    <h3><a name="stdin" id="stdin">STDIN and STDOUT</a></h3>
 
459
      
 
460
 
 
461
      <p>Other communication between the server and the client
 
462
      happens over standard input (<code>STDIN</code>) and standard
 
463
      output (<code>STDOUT</code>). In normal everyday context, 
 
464
      <code>STDIN</code> means the keyboard, or a file that a 
 
465
      program is given to act on, and <code>STDOUT</code>
 
466
      usually means the console or screen.</p> 
 
467
 
 
468
      <p>When you <code>POST</code> a web form to a CGI program,
 
469
      the data in that form is bundled up into a special format
 
470
      and gets delivered to your CGI program over <code>STDIN</code>.
 
471
      The program then can process that data as though it was
 
472
      coming in from the keyboard, or from a file</p>
 
473
 
 
474
      <p>The "special format" is very simple. A field name and
 
475
      its value are joined together with an equals (=) sign, and
 
476
      pairs of values are joined together with an ampersand
 
477
      (&amp;). Inconvenient characters like spaces, ampersands, and
 
478
      equals signs, are converted into their hex equivalent so that
 
479
      they don't gum up the works. The whole data string might look
 
480
      something like:</p>
 
481
 
 
482
      <div class="example"><p><code>
 
483
        name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
 
484
      </code></p></div>
 
485
 
 
486
      <p>You'll sometimes also see this type of string appended to
 
487
      a URL. When that is done, the server puts that string
 
488
      into the environment variable called 
 
489
      <code>QUERY_STRING</code>. That's called a <code>GET</code>
 
490
      request. Your HTML form specifies whether a <code>GET</code>
 
491
      or a <code>POST</code> is used to deliver the data, by setting the 
 
492
      <code>METHOD</code> attribute in the <code>FORM</code> tag.</p>
 
493
 
 
494
      <p>Your program is then responsible for splitting that string
 
495
      up into useful information. Fortunately, there are libraries
 
496
      and modules available to help you process this data, as well
 
497
      as handle other of the aspects of your CGI program.</p>
 
498
    
 
499
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 
500
<div class="section">
 
501
<h2><a name="libraries" id="libraries">CGI modules/libraries</a></h2>
 
502
    
 
503
 
 
504
    <p>When you write CGI programs, you should consider using a
 
505
    code library, or module, to do most of the grunt work for you.
 
506
    This leads to fewer errors, and faster development.</p>
 
507
 
 
508
    <p>If you're writing CGI programs in Perl, modules are
 
509
    available on <a href="http://www.cpan.org/">CPAN</a>. The most
 
510
    popular module for this purpose is <code>CGI.pm</code>. You might
 
511
    also consider <code>CGI::Lite</code>, which implements a minimal
 
512
    set of functionality, which is all you need in most programs.</p>
 
513
 
 
514
    <p>If you're writing CGI programs in C, there are a variety of
 
515
    options. One of these is the <code>CGIC</code> library, from 
 
516
    <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>.</p>
 
517
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
 
518
<div class="section">
 
519
<h2><a name="moreinfo" id="moreinfo">For more information</a></h2>
 
520
    
 
521
 
 
522
    <p>There are a large number of CGI resources on the web. You
 
523
    can discuss CGI problems with other users on the Usenet group
 
524
    <a href="news:comp.infosystems.www.authoring.cgi">comp.infosystems.www.authoring.cgi</a>. And the -servers mailing
 
525
    list from the HTML Writers Guild is a great source of answers
 
526
    to your questions. You can find out more at 
 
527
    <a href="http://www.hwg.org/lists/hwg-servers/">http://www.hwg.org/lists/hwg-servers/</a>.</p>
 
528
 
 
529
    <p>And, of course, you should probably read the CGI
 
530
    specification, which has all the details on the operation of
 
531
    CGI programs. You can find the original version at the 
 
532
    <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a> and there is an updated draft at the 
 
533
    <a href="http://web.golux.com/coar/cgi/">Common Gateway
 
534
    Interface RFC project</a>.</p>
 
535
 
 
536
    <p>When you post a question about a CGI problem that you're
 
537
    having, whether to a mailing list, or to a newsgroup, make sure
 
538
    you provide enough information about what happened, what you
 
539
    expected to happen, and how what actually happened was
 
540
    different, what server you're running, what language your CGI
 
541
    program was in, and, if possible, the offending code. This will
 
542
    make finding your problem much simpler.</p>
 
543
 
 
544
    <p>Note that questions about CGI problems should <strong>never</strong>
 
545
    be posted to the Apache bug database unless you are sure you
 
546
    have found a problem in the Apache source code.</p>
 
547
  </div></div>
 
548
<div class="bottomlang">
 
549
<p><span>Available Languages: </span><a href="../en/howto/cgi.html" title="English">&nbsp;en&nbsp;</a> |
 
550
<a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
 
551
<a href="../ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
 
552
</div><div id="footer">
 
553
<p class="apache">Copyright 2006 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
 
554
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div>
 
555
</body></html>
 
 
b'\\ No newline at end of file'