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
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.1</p>
16 <img alt="" src="../images/feather.gif" /></div>
17 <div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
19 <a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs-project/">Documentation</a> > <a href="../">Version 2.1</a> > <a href="./">How-To / Tutorials</a></div><div id="page-content"><div id="preamble"><h1>Apache Tutorial: Dynamic Content with CGI</h1>
21 <p><span>Available Languages: </span><a href="../en/howto/cgi.html" hreflang="en" title="English"> en </a> | <a href="../ja/howto/cgi.html" hreflang="ja" title="Japanese"> ja </a></p>
24 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#intro">Introduction</a></li>
25 <li><img alt="" src="../images/down.gif" /> <a href="#configuring">Configuring Apache to permit CGI</a></li>
26 <li><img alt="" src="../images/down.gif" /> <a href="#writing">Writing a CGI program</a></li>
27 <li><img alt="" src="../images/down.gif" /> <a href="#troubleshoot">But it's still not working!</a></li>
28 <li><img alt="" src="../images/down.gif" /> <a href="#behindscenes">What's going on behind the scenes?</a></li>
29 <li><img alt="" src="../images/down.gif" /> <a href="#libraries">CGI modules/libraries</a></li>
30 <li><img alt="" src="../images/down.gif" /> <a href="#moreinfo">For more information</a></li>
32 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
34 <h2><a name="intro" id="intro">Introduction</a></h2>
37 <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>
39 <p>The CGI (Common Gateway Interface) defines a way for a web
40 server to interact with external content-generating programs,
41 which are often referred to as CGI programs or CGI scripts. It
42 is the simplest, and most common, way to put dynamic content on
43 your web site. This document will be an introduction to setting
44 up CGI on your Apache web server, and getting started writing
46 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
48 <h2><a name="configuring" id="configuring">Configuring Apache to permit CGI</a></h2>
51 <p>In order to get your CGI programs to work properly, you'll
52 need to have Apache configured to permit CGI execution. There
53 are several ways to do this.</p>
55 <h3><a name="scriptalias" id="scriptalias">ScriptAlias</a></h3>
59 <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
61 directive tells Apache that a particular directory is set
62 aside for CGI programs. Apache will assume that every file in
63 this directory is a CGI program, and will attempt to execute
64 it, when that particular resource is requested by a
67 <p>The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
68 directive looks like:</p>
70 <div class="example"><p><code>
71 ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
74 <p>The example shown is from your default <code>httpd.conf</code>
75 configuration file, if you installed Apache in the default
76 location. The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
77 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
78 is to mapped to a particular directory. <code class="directive">Alias</code>
79 and <code class="directive">ScriptAlias</code> are usually used for
80 directories that are outside of the <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> directory. The difference between
81 <code class="directive">Alias</code> and <code class="directive">ScriptAlias</code>
82 is that <code class="directive">ScriptAlias</code> has the added meaning
83 that everything under that URL prefix will be considered a CGI
84 program. So, the example above tells Apache that any request for a
85 resource beginning with <code>/cgi-bin/</code> should be served from
86 the directory <code>/usr/local/apache/cgi-bin/</code>, and should be
87 treated as a CGI program.</p>
89 <p>For example, if the URL
90 <code>http://www.example.com/cgi-bin/test.pl</code>
91 is requested, Apache will attempt to execute the file
92 <code>/usr/local/apache/cgi-bin/test.pl</code>
93 and return the output. Of course, the file will have to
94 exist, and be executable, and return output in a particular
95 way, or Apache will return an error message.</p>
98 <h3><a name="nonscriptalias" id="nonscriptalias">CGI outside of ScriptAlias directories</a></h3>
101 <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.
102 In this way, administrators can tightly control who is allowed to
103 use CGI programs. However, if the proper security precautions are
104 taken, there is no reason why CGI programs cannot be run from
105 arbitrary directories. For example, you may wish to let users
106 have web content in their home directories with the
107 <code class="directive"><a href="../mod/mod_userdir.html#userdir">UserDir</a></code> directive.
108 If they want to have their own CGI programs, but don't have access to
109 the main <code>cgi-bin</code> directory, they will need to be able to
110 run CGI programs elsewhere.</p>
113 <h3><a name="options" id="options">Explicitly using Options to permit CGI execution</a></h3>
116 <p>You could explicitly use the <code class="directive"><a href="../mod/core.html#options">Options</a></code> directive, inside your main server configuration
117 file, to specify that CGI execution was permitted in a particular
120 <div class="example"><p><code>
121 <Directory /usr/local/apache/htdocs/somedir><br />
122 <span class="indent">
123 Options +ExecCGI<br />
128 <p>The above directive tells Apache to permit the execution
129 of CGI files. You will also need to tell the server what
130 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
131 files with the <code>cgi</code> or <code>pl</code> extension as CGI
134 <div class="example"><p><code>
135 AddHandler cgi-script cgi pl
139 <h3><a name="htaccess" id="htaccess">.htaccess files</a></h3>
142 <p>A <a href="htaccess.html"><code>.htaccess</code> file</a> is a way
143 to set configuration directives on a per-directory basis. When Apache
144 serves a resource, it looks in the directory from which it is serving
145 a file for a file called <code>.htaccess</code>, and, if it
146 finds it, it will apply directives found therein.
148 <code>.htaccess</code> files can be permitted with the
149 <code class="directive"><a href="../mod/core.html#allowoverride">AllowOverride</a></code> directive,
150 which specifies what types of directives can
151 appear in these files, or if they are not allowed at all. To
152 permit the directive we will need for this purpose, the
153 following configuration will be needed in your main server
156 <div class="example"><p><code>
157 AllowOverride Options
160 <p>In the <code>.htaccess</code> file, you'll need the
161 following directive:</p>
163 <div class="example"><p><code>
167 <p>which tells Apache that execution of CGI programs is
168 permitted in this directory.</p>
170 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
171 <div class="section">
172 <h2><a name="writing" id="writing">Writing a CGI program</a></h2>
175 <p>There are two main differences between ``regular''
176 programming, and CGI programming.</p>
178 <p>First, all output from your CGI program must be preceded by
179 a MIME-type header. This is HTTP header that tells the client
180 what sort of content it is receiving. Most of the time, this
183 <div class="example"><p><code>
184 Content-type: text/html
187 <p>Secondly, your output needs to be in HTML, or some other
188 format that a browser will be able to display. Most of the
189 time, this will be HTML, but occasionally you might write a CGI
190 program that outputs a gif image, or other non-HTML
193 <p>Apart from those two things, writing a CGI program will look
194 a lot like any other program that you might write.</p>
196 <h3><a name="firstcgi" id="firstcgi">Your first CGI program</a></h3>
199 <p>The following is an example CGI program that prints one
200 line to your browser. Type in the following, save it to a
201 file called <code>first.pl</code>, and put it in your
202 <code>cgi-bin</code> directory.</p>
204 <div class="example"><p><code>
205 #!/usr/bin/perl<br />
206 print "Content-type: text/html\n\n";<br />
207 print "Hello, World.";
210 <p>Even if you are not familiar with Perl, you should be able
211 to see what is happening here. The first line tells Apache
212 (or whatever shell you happen to be running under) that this
213 program can be executed by feeding the file to the
214 interpreter found at the location <code>/usr/bin/perl</code>.
215 The second line prints the content-type declaration we
216 talked about, followed by two carriage-return newline pairs.
217 This puts a blank line after the header, to indicate the end
218 of the HTTP headers, and the beginning of the body. The third
219 line prints the string "Hello, World.". And that's the end
222 <p>If you open your favorite browser and tell it to get the
225 <div class="example"><p><code>
226 http://www.example.com/cgi-bin/first.pl
229 <p>or wherever you put your file, you will see the one line
230 <code>Hello, World.</code> appear in your browser window.
231 It's not very exciting, but once you get that working, you'll
232 have a good chance of getting just about anything working.</p>
234 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
235 <div class="section">
236 <h2><a name="troubleshoot" id="troubleshoot">But it's still not working!</a></h2>
239 <p>There are four basic things that you may see in your browser
240 when you try to access your CGI program from the web:</p>
243 <dt>The output of your CGI program</dt>
244 <dd>Great! That means everything worked fine.</dd>
246 <dt>The source code of your CGI program or a "POST Method Not
247 Allowed" message</dt>
248 <dd>That means that you have not properly configured Apache
249 to process your CGI program. Reread the section on
250 <a href="#configuringapachetopermitcgi">configuring
251 Apache</a> and try to find what you missed.</dd>
253 <dt>A message starting with "Forbidden"</dt>
254 <dd>That means that there is a permissions problem. Check the
255 <a href="#errorlogs">Apache error log</a> and the section below on
256 <a href="#permissions">file permissions</a>.</dd>
258 <dt>A message saying "Internal Server Error"</dt>
260 <a href="#errorlogs">Apache error log</a>, you will probably
261 find that it says "Premature end of
262 script headers", possibly along with an error message
263 generated by your CGI program. In this case, you will want to
264 check each of the below sections to see what might be
265 preventing your CGI program from emitting the proper HTTP
269 <h3><a name="permissions" id="permissions">File permissions</a></h3>
272 <p>Remember that the server does not run as you. That is,
273 when the server starts up, it is running with the permissions
274 of an unprivileged user - usually <code>nobody</code>, or
275 <code>www</code> - and so it will need extra permissions to
276 execute files that are owned by you. Usually, the way to give
277 a file sufficient permissions to be executed by <code>nobody</code>
278 is to give everyone execute permission on the file:</p>
280 <div class="example"><p><code>
284 <p>Also, if your program reads from, or writes to, any other
285 files, those files will need to have the correct permissions
288 <p>The exception to this is when the server is configured to
289 use <a href="../suexec.html">suexec</a>. This program allows
290 CGI programs to be run under different
291 user permissions, depending on which virtual host or user
292 home directory they are located in. Suexec has very strict
293 permission checking, and any failure in that checking will
294 result in your CGI programs failing with an "Internal Server
295 Error". In this case, you will need to check the suexec log
296 file to see what specific security check is failing.</p>
299 <h3><a name="pathinformation" id="pathinformation">Path information</a></h3>
302 <p>When you run a program from your command line, you have
303 certain information that is passed to the shell without you
304 thinking about it. For example, you have a path, which tells
305 the shell where it can look for files that you reference.</p>
307 <p>When a program runs through the web server as a CGI
308 program, it does not have that path. Any programs that you
309 invoke in your CGI program (like 'sendmail', for example)
310 will need to be specified by a full path, so that the shell
311 can find them when it attempts to execute your CGI
314 <p>A common manifestation of this is the path to the script
315 interpreter (often <code>perl</code>) indicated in the first
316 line of your CGI program, which will look something like:</p>
318 <div class="example"><p><code>
322 <p>Make sure that this is in fact the path to the
326 <h3><a name="syntaxerrors" id="syntaxerrors">Syntax errors</a></h3>
329 <p>Most of the time when a CGI program fails, it's because of
330 a problem with the program itself. This is particularly true
331 once you get the hang of this CGI stuff, and no longer make
332 the above two mistakes. Always attempt to run your program
333 from the command line before you test if via a browser. This
334 will eliminate most of your problems.</p>
337 <h3><a name="errorlogs" id="errorlogs">Error logs</a></h3>
340 <p>The error logs are your friend. Anything that goes wrong
341 generates message in the error log. You should always look
342 there first. If the place where you are hosting your web site
343 does not permit you access to the error log, you should
344 probably host your site somewhere else. Learn to read the
345 error logs, and you'll find that almost all of your problems
346 are quickly identified, and quickly solved.</p>
348 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
349 <div class="section">
350 <h2><a name="behindscenes" id="behindscenes">What's going on behind the scenes?</a></h2>
353 <p>As you become more advanced in CGI programming, it will
354 become useful to understand more about what's happening behind
355 the scenes. Specifically, how the browser and server
356 communicate with one another. Because although it's all very
357 well to write a program that prints "Hello, World.", it's not
358 particularly useful.</p>
360 <h3><a name="env" id="env">Environment variables</a></h3>
363 <p>Environment variables are values that float around you as
364 you use your computer. They are useful things like your path
365 (where the computer searches for a the actual file
366 implementing a command when you type it), your username, your
367 terminal type, and so on. For a full list of your normal,
368 every day environment variables, type
369 <code>env</code> at a command prompt.</p>
371 <p>During the CGI transaction, the server and the browser
372 also set environment variables, so that they can communicate
373 with one another. These are things like the browser type
374 (Netscape, IE, Lynx), the server type (Apache, IIS, WebSite),
375 the name of the CGI program that is being run, and so on.</p>
377 <p>These variables are available to the CGI programmer, and
378 are half of the story of the client-server communication. The
379 complete list of required variables is at
380 <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>.</p>
382 <p>This simple Perl CGI program will display all of the
383 environment variables that are being passed around. Two
384 similar programs are included in the
387 directory of the Apache distribution. Note that some
388 variables are required, while others are optional, so you may
389 see some variables listed that were not in the official list.
390 In addition, Apache provides many different ways for you to
391 <a href="../env.html">add your own environment variables</a>
392 to the basic ones provided by default.</p>
394 <div class="example"><p><code>
395 #!/usr/bin/perl<br />
396 print "Content-type: text/html\n\n";<br />
397 foreach $key (keys %ENV) {<br />
398 <span class="indent">
399 print "$key --> $ENV{$key}<br>";<br />
405 <h3><a name="stdin" id="stdin">STDIN and STDOUT</a></h3>
408 <p>Other communication between the server and the client
409 happens over standard input (<code>STDIN</code>) and standard
410 output (<code>STDOUT</code>). In normal everyday context,
411 <code>STDIN</code> means the keyboard, or a file that a
412 program is given to act on, and <code>STDOUT</code>
413 usually means the console or screen.</p>
415 <p>When you <code>POST</code> a web form to a CGI program,
416 the data in that form is bundled up into a special format
417 and gets delivered to your CGI program over <code>STDIN</code>.
418 The program then can process that data as though it was
419 coming in from the keyboard, or from a file</p>
421 <p>The "special format" is very simple. A field name and
422 its value are joined together with an equals (=) sign, and
423 pairs of values are joined together with an ampersand
424 (&). Inconvenient characters like spaces, ampersands, and
425 equals signs, are converted into their hex equivalent so that
426 they don't gum up the works. The whole data string might look
429 <div class="example"><p><code>
430 name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
433 <p>You'll sometimes also see this type of string appended to
434 the a URL. When that is done, the server puts that string
435 into the environment variable called
436 <code>QUERY_STRING</code>. That's called a <code>GET</code>
437 request. Your HTML form specifies whether a <code>GET</code>
438 or a <code>POST</code> is used to deliver the data, by setting the
439 <code>METHOD</code> attribute in the <code>FORM</code> tag.</p>
441 <p>Your program is then responsible for splitting that string
442 up into useful information. Fortunately, there are libraries
443 and modules available to help you process this data, as well
444 as handle other of the aspects of your CGI program.</p>
446 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
447 <div class="section">
448 <h2><a name="libraries" id="libraries">CGI modules/libraries</a></h2>
451 <p>When you write CGI programs, you should consider using a
452 code library, or module, to do most of the grunt work for you.
453 This leads to fewer errors, and faster development.</p>
455 <p>If you're writing CGI programs in Perl, modules are
456 available on <a href="http://www.cpan.org/">CPAN</a>. The most
457 popular module for this purpose is <code>CGI.pm</code>. You might
458 also consider <code>CGI::Lite</code>, which implements a minimal
459 set of functionality, which is all you need in most programs.</p>
461 <p>If you're writing CGI programs in C, there are a variety of
462 options. One of these is the <code>CGIC</code> library, from
463 <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>.</p>
464 </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
465 <div class="section">
466 <h2><a name="moreinfo" id="moreinfo">For more information</a></h2>
469 <p>There are a large number of CGI resources on the web. You
470 can discuss CGI problems with other users on the Usenet group
471 <a href="news:comp.infosystems.www.authoring.cgi">comp.infosystems.www.authoring.cgi</a>. And the -servers mailing
472 list from the HTML Writers Guild is a great source of answers
473 to your questions. You can find out more at
474 <a href="http://www.hwg.org/lists/hwg-servers/">http://www.hwg.org/lists/hwg-servers/</a>.</p>
476 <p>And, of course, you should probably read the CGI
477 specification, which has all the details on the operation of
478 CGI programs. You can find the original version at the
479 <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a> and there is an updated draft at the
480 <a href="http://web.golux.com/coar/cgi/">Common Gateway
481 Interface RFC project</a>.</p>
483 <p>When you post a question about a CGI problem that you're
484 having, whether to a mailing list, or to a newsgroup, make sure
485 you provide enough information about what happened, what you
486 expected to happen, and how what actually happened was
487 different, what server you're running, what language your CGI
488 program was in, and, if possible, the offending code. This will
489 make finding your problem much simpler.</p>
491 <p>Note that questions about CGI problems should <strong>never</strong>
492 be posted to the Apache bug database unless you are sure you
493 have found a problem in the Apache source code.</p>
495 <div class="bottomlang">
496 <p><span>Available Languages: </span><a href="../en/howto/cgi.html" hreflang="en" title="English"> en </a> | <a href="../ja/howto/cgi.html" hreflang="ja" title="Japanese"> ja </a></p>
497 </div><div id="footer">
498 <p class="apache">Maintained by the <a href="http://httpd.apache.org/docs-project/">Apache HTTP Server Documentation Project</a></p>
499 <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>