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