switch to a 60 bit hash
[httpd-crcsyncproxy.git] / docs / manual / howto / cgi.xml.fr
blobfab58867fd763255cb5481b44e6d52ee0fea3a21
1 <?xml version="1.0" encoding="ISO-8859-1" ?>
2 <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision : 705116 -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
7 <!-- $LastChangedRevision: 2008051801 $ -->
9 <!--
10 Licensed to the Apache Software Foundation (ASF) under one or more
11 contributor license agreements. See the NOTICE file distributed with
12 this work for additional information regarding copyright ownership.
13 The ASF licenses this file to You under the Apache License, Version 2.0
14 (the "License"); you may not use this file except in compliance with
15 the License. You may obtain a copy of the License at
17 http://www.apache.org/licenses/LICENSE-2.0
19 Unless required by applicable law or agreed to in writing, software
20 distributed under the License is distributed on an "AS IS" BASIS,
21 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 See the License for the specific language governing permissions and
23 limitations under the License.
24 -->
26 <manualpage metafile="cgi.xml.meta">
27 <parentdocument href="./">Recettes et tutoriels</parentdocument>
29 <title>Tutoriel Apache : Contenu dynamique bas&eacute; sur CGI</title>
31 <section id="intro">
32 <title>Introduction</title>
34 <related>
35 <modulelist>
36 <module>mod_alias</module>
37 <module>mod_cgi</module>
38 </modulelist>
40 <directivelist>
41 <directive module="mod_mime">AddHandler</directive>
42 <directive module="core">Options</directive>
43 <directive module="mod_alias">ScriptAlias</directive>
44 </directivelist>
45 </related>
47 <p>CGI (Common Gateway Interface) d&eacute;finit une m&eacute;thode d'interaction
48 entre un serveur web et des programmes g&eacute;n&eacute;rateurs de contenu
49 externes, plus souvent appel&eacute;s programmes CGI ou scripts CGI. Il
50 s'agit de la m&eacute;thode la plus simple, et la plus
51 courante, pour ajouter du contenu dynamique &agrave; votre site web. Ce
52 document est une introduction &agrave; la configuration de CGI sur votre
53 serveur web Apache, et une initiation &agrave; l'&eacute;criture de programmes
54 CGI.</p>
55 </section>
57 <section id="configuring">
58 <title>Configurer Apache pour autoriser CGI</title>
60 <p>Apache doit &ecirc;tre configur&eacute; pour permettre l'ex&eacute;cution des
61 programmes CGI, pour que vos programmes CGI puissent fonctionner
62 correctement. Il existe plusieurs m&eacute;thodes pour y parvenir.</p>
64 <note type="warning">Note: si Apache a &eacute;t&eacute; compil&eacute; avec le support
65 des modules partag&eacute;s (DSO), vous devez vous assurer que le module CGI est
66 charg&eacute; ; vous devez pour cela v&eacute;rifier que la directive <directive
67 module="mod_so">LoadModule</directive> correspondante n'a pas &eacute;t&eacute;
68 comment&eacute;e dans votre <code>httpd.conf</code>. Une directive correcte
69 doit ressembler &agrave; ceci :
71 <example>
72 LoadModule cgi_module modules/mod_cgi.so
73 </example></note>
75 <section id="scriptalias">
76 <title>ScriptAlias</title>
78 <p>La directive <directive
79 module="mod_alias">ScriptAlias</directive> indique &agrave; Apache qu'un
80 r&eacute;pertoire particulier est d&eacute;di&eacute; aux programmes CGI. Apache
81 consid&eacute;rera que tout fichier situ&eacute; dans ce r&eacute;pertoire est un
82 programme CGI, et tentera de l'ex&eacute;cuter lorsque cette ressource
83 fera l'objet d'une requ&ecirc;te client.</p>
85 <p>La directive <directive
86 module="mod_alias">ScriptAlias</directive> se pr&eacute;sente comme suit
87 :</p>
89 <example>
90 ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
91 </example>
93 <p>Cet exemple est tir&eacute; de votre fichier de configuration
94 <code>httpd.conf</code> par d&eacute;faut, si vous avez install&eacute; Apache
95 dans son r&eacute;pertoire par d&eacute;faut. La directive <directive
96 module="mod_alias">ScriptAlias</directive> est similaire &agrave; la
97 directive <directive module="mod_alias">Alias</directive>, qui
98 d&eacute;finit &agrave; quel r&eacute;pertoire particulier doit correspondre un pr&eacute;fixe
99 d'URL. <directive>Alias</directive> et
100 <directive>ScriptAlias</directive> sont g&eacute;n&eacute;ralement utilis&eacute;s pour
101 acc&eacute;der &agrave; des r&eacute;pertoires situ&eacute;s en dehors du r&eacute;pertoire d&eacute;fini
102 par la directive <directive
103 module="core">DocumentRoot</directive>. La diff&eacute;rence entre
104 <directive>Alias</directive> et <directive>ScriptAlias</directive>
105 r&eacute;side dans le fait que <directive>ScriptAlias</directive> indique
106 en plus que tout ce qui se trouve sous le pr&eacute;fixe d'URL doit &ecirc;tre
107 consid&eacute;r&eacute; comme un programme CGI. Ainsi, l'exemple ci-dessus
108 indique &agrave; Apache que toute requ&ecirc;te pour une ressource commen&ccedil;ant
109 par <code>/cgi-bin/</code> doit &ecirc;tre servie depuis le r&eacute;pertoire
110 <code>/usr/local/apache2/cgi-bin/</code>, et doit &ecirc;tre trait&eacute;e en
111 tant que programme CGI.</p>
113 <p>Par exemple, si une requ&ecirc;te pour l'URL
114 <code>http://www.example.com/cgi-bin/test.pl</code> est
115 effectu&eacute;e, Apache tentera d'ex&eacute;cuter le fichier
116 <code>/usr/local/apache2/cgi-bin/test.pl</code> et en renverra la
117 sortie. Bien entendu, le fichier doit exister, &ecirc;tre ex&eacute;cutable, et
118 retourner sa sortie d'une mani&egrave;re particuli&egrave;re, sinon Apache
119 renverra un message d'erreur.</p>
120 </section>
122 <section id="nonscriptalias">
123 <title>CGI en dehors des r&eacute;pertoires ScripAlias</title>
125 <p>Pour des raisons de s&eacute;curit&eacute;, la localisation des programmes
126 CGI est souvent restreinte aux
127 r&eacute;pertoires d&eacute;finis par <directive module="mod_alias"
128 >ScriptAlias</directive>. De cette mani&egrave;re, les administrateurs
129 peuvent contr&ocirc;ler pr&eacute;cis&eacute;ment qui est autoris&eacute; &agrave; utiliser les
130 programmes CGI. Cependant, si les pr&eacute;cautions ad&eacute;quates quant &agrave;
131 la s&eacute;curit&eacute; sont prises, il n'y a aucune raison pour que les
132 programmes CGI ne puissent pas &ecirc;tre ex&eacute;cut&eacute;s depuis d'autres
133 r&eacute;pertoires. Par exemple, vous pouvez autoriser les utilisateurs &agrave;
134 enregistrer des contenus web dans leurs r&eacute;pertoires home &agrave; l'aide
135 de la directive <directive
136 module="mod_userdir">UserDir</directive>. S'ils veulent mettre en
137 oeuvre leurs propres programmes CGI, mais n'ont pas l'autorisation
138 d'acc&egrave;s au r&eacute;pertoire <code>cgi-bin</code> principal, ils devront
139 &ecirc;tre en mesure d'ex&eacute;cuter ces programmes depuis un autre
140 r&eacute;pertoire.</p>
142 <p>L'autorisation d'ex&eacute;cution des programmes CGI dans un
143 r&eacute;pertoire arbitraire se fait en deux &eacute;tapes. En premier lieu, le
144 gestionnaire <code>cgi-script</code> doit &ecirc;tre activ&eacute; &agrave; l'aide
145 d'une directive <directive
146 module="mod_mime">AddHandler</directive> ou <directive
147 module="core">SetHandler</directive>. En second lieu,
148 <code>ExecCGI</code> doit &ecirc;tre sp&eacute;cifi&eacute; dans la directive <directive
149 module="core">Options</directive>.</p>
150 </section>
152 <section id="options">
153 <title>Utilisation d'options explicites pour permettre l'ex&eacute;cution
154 des programmes CGI</title>
156 <p>Vous pouvez utiliser de mani&egrave;re explicite la directive
157 <directive module="core">Options</directive> dans le fichier de
158 configuration de votre serveur principal, pour indiquer que
159 l'ex&eacute;cution des programmes CGI est permise depuis un r&eacute;pertoire
160 particulier :</p>
162 <example>
163 &lt;Directory /usr/local/apache2/htdocs/un-repertoire&gt;<br />
164 <indent>
165 Options +ExecCGI<br />
166 </indent>
167 &lt;/Directory&gt;
168 </example>
170 <p>La directive ci-dessus indique &agrave; Apache qu'il doit permettre
171 l'ex&eacute;cution des fichiers CGI. Vous devez aussi indiquer au serveur
172 quels fichiers sont des fichiers CGI. La directive <directive
173 module="mod_mime">AddHandler</directive> suivante indique au
174 serveur qu'il doit traiter tous les fichiers poss&eacute;dant une
175 extension <code>cgi</code> ou <code>pl</code> en tant que
176 programmes CGI :</p>
178 <example>
179 AddHandler cgi-script .cgi .pl
180 </example>
181 </section>
183 <section id="htaccess">
184 <title>Fichiers .htaccess</title>
186 <p>Le <a href="htaccess.html"><code>tutoriel
187 .htaccess</code></a> montre comment activer les programmes
188 CGI si vous n'avez pas acc&egrave;s au
189 fichier <code>httpd.conf</code>.</p>
190 </section>
192 <section id="userdir">
193 <title>R&eacute;pertoires utilisateurs</title>
195 <p>Pour permettre l'ex&eacute;cution en tant que programme CGI de tout
196 fichier poss&eacute;dant l'extension <code>.cgi</code> et situ&eacute; dans un
197 r&eacute;pertoire utilisateur, vous pouvez utiliser la configuration
198 suivante :</p>
200 <example>
201 &lt;Directory /home/*/public_html&gt;<br/>
202 <indent>
203 Options +ExecCGI<br/>
204 AddHandler cgi-script .cgi<br/>
205 </indent>
206 &lt;/Directory&gt;
207 </example>
209 <p>Pour indiquer un sous-r&eacute;pertoire <code>cgi-bin</code> d'un
210 r&eacute;pertoire utilisateur o&ugrave; tout fichier sera trait&eacute; en tant que
211 programme CGI, vous pouvez utiliser ceci :</p>
213 <example>
214 &lt;Directory /home/*/public_html/cgi-bin&gt;<br/>
215 <indent>
216 Options ExecCGI<br/>
217 SetHandler cgi-script<br/>
218 </indent>
219 &lt;/Directory&gt;
220 </example>
222 </section>
224 </section>
226 <section id="writing">
227 <title>Ecrire un programme CGI</title>
229 <p>Il y a deux diff&eacute;rences principales entre la programmation
230 "standard" et la programmation CGI.</p>
232 <p>En premier lieu, toute sortie de votre programme CGI doit &ecirc;tre
233 pr&eacute;c&eacute;d&eacute;e d'un en-t&ecirc;te <glossary>MIME-type</glossary>. Il s'agit d'un
234 en-t&ecirc;te HTTP qui indique au client quel type de contenu il re&ccedil;oit.
235 La plupart du temps, il se pr&eacute;sente comme suit :</p>
237 <example>
238 Content-type: text/html
239 </example>
241 <p>En second lieu, votre sortie doit &ecirc;tre en HTML, ou tout autre
242 format qu'un navigateur est en mesure d'afficher. La plupart du
243 temps, il s'agira de HTML, mais occasionnellement, vous pouvez &ecirc;tre
244 amen&eacute; &agrave; &eacute;crire un programme CGI qui renvoie une image gif, ou un
245 autre type de contenu non-HTML.</p>
247 <p>A part ces deux diff&eacute;rences, un programme CGI ressemblera &agrave; tout
248 autre programme que vous pourriez &ecirc;tre amen&eacute; &agrave; &eacute;crire.</p>
250 <section id="firstcgi">
251 <title>Votre premier programme CGI</title>
253 <p>L'exemple suivant est un exemple de programme CGI qui permet
254 d'afficher une ligne de caract&egrave;res dans votre navigateur. Ecrivez
255 ce qui suit, enregistrez le dans un fichier nomm&eacute;
256 <code>premier.pl</code>, et placez le dans votre r&eacute;pertoire
257 <code>cgi-bin</code>.</p>
259 <example>
260 #!/usr/bin/perl<br />
261 print "Content-type: text/html\n\n";<br />
262 print "Bonjour tout le monde . . .";
263 </example>
265 <p>M&ecirc;me si Perl ne vous est pas familier, vous devriez &ecirc;tre
266 capable de comprendre le fonctionnement de ce programme. La
267 premi&egrave;re ligne indique &agrave; Apache (ou &agrave; toute interface &agrave; partir de
268 laquelle le programme s'ex&eacute;cute) que ce programme peut &ecirc;tre
269 ex&eacute;cut&eacute; en fournissant son fichier &agrave; l'interpr&eacute;teur
270 <code>/usr/bin/perl</code>. La seconde ligne affiche la
271 d&eacute;claration du type de contenu consid&eacute;r&eacute;, suivie de deux paires
272 "Retour chariot - Nouvelle ligne". Ceci a pour effet d'ins&eacute;rer une
273 ligne vide apr&egrave;s l'en-t&ecirc;te pour marquer la fin des en-t&ecirc;tes HTTP,
274 et le d&eacute;but du corps du document. La troisi&egrave;me ligne affiche la
275 cha&icirc;ne de caract&egrave;res "Bonjour tout le monde . . .". Et c'est tout
276 ce dont vous avez besoin.</p>
278 <p>Si vous ouvrez votre navigateur favori et lui indiquez
279 l'adresse</p>
281 <example>
282 http://www.exemple.com/cgi-bin/premier.pl
283 </example>
285 <p>ou toute autre URL correspondant &agrave; votre programme CGI, Vous
286 verrez la ligne <code>Bonjour tout le monde . . .</code>
287 s'afficher dans la fen&ecirc;tre de votre navigateur. Ce n'est pas
288 extraordinaire, mais si vous y &ecirc;tes parvenu, vous avez de bonnes
289 chances d'y parvenir pour tout autre programme plus
290 sophistiqu&eacute;.</p>
291 </section>
292 </section>
294 <section id="troubleshoot">
295 <title>Mais &ccedil;a ne marche toujours pas !</title>
297 <p>Vous devriez voir au moins une des quatre sorties suivantes dans
298 votre navigateur lorsque vous essayez d'acc&eacute;der &agrave; votre programme
299 CGI depuis le web :</p>
301 <dl>
302 <dt>Le flux de sortie de votre programme CGI</dt>
303 <dd>Impeccable ! Cela signifie que tout fonctionne correctement.
304 Si la sortie est correcte mais n'est pas trait&eacute;e correctement par
305 le navigateur, assurez-vous d'avoir d&eacute;fini
306 <code>Content-Type</code> de mani&egrave;re appropri&eacute;e dans votre
307 programme CGI.</dd>
309 <dt>Le code source de votre programme CGI ou un message "POST
310 Method Not Allowed"</dt>
311 <dd>Cela signifie que vous n'avez pas configur&eacute; Apache de mani&egrave;re
312 &agrave; ce qu'il puisse traiter votre programme CGI. Relisez la section
313 sur la <a href="#configuring">configuration d'Apache</a>, et
314 essayez de trouver votre erreur.</dd>
316 <dt>Un message commen&ccedil;ant par "Forbidden"</dt>
317 <dd>Ce type de message est r&eacute;v&eacute;lateur d'un probl&egrave;me de
318 droits. Consultez le <a href="#errorlogs">journal des erreurs
319 d'Apache</a> et la section ci-dessous sur les <a
320 href="#permissions">droits des fichiers</a>.</dd>
322 <dt>Un message contenant "Internal Server Error"</dt>
323 <dd>Si vous consultez le <a href="#errorlogs">journal des erreurs
324 d'Apache</a>, vous y trouverez probablement des messages du type
325 "Premature end of script headers" (Fin pr&eacute;matur&eacute;e des en-t&ecirc;tes de
326 script), &eacute;ventuellement accompagn&eacute;s d'un message d'erreur g&eacute;n&eacute;r&eacute;
327 par votre programme CGI. Dans ce cas, il va vous falloir lire
328 chacune des sections ci-dessous pour d&eacute;terminer ce qui emp&ecirc;che
329 votre programme CGI de g&eacute;n&eacute;rer les en-t&ecirc;tes appropri&eacute;s.</dd>
330 </dl>
332 <section id="permissions">
333 <title>Droits des fichiers</title>
335 <p>Souvenez-vous que le serveur ne s'ex&eacute;cute pas sous votre nom.
336 En d'autres termes, lorsque le serveur a d&eacute;marr&eacute;, il s'ex&eacute;cute
337 avec les droits d'un utilisateur non privil&eacute;gi&eacute; - en g&eacute;n&eacute;ral
338 <code>nobody</code>, ou <code>www</code> - et en cons&eacute;quence, il
339 aura besoin de droits suppl&eacute;mentaires pour pouvoir ex&eacute;cuter des
340 fichiers dont vous &ecirc;tes le propri&eacute;taire. En g&eacute;n&eacute;ral, pour qu'un
341 fichier ait des droits suffisants pour &ecirc;tre ex&eacute;cutable par
342 <code>nobody</code>, il suffit de lui attribuer des droits
343 d'ex&eacute;cution pour tout le monde :</p>
345 <example>
346 chmod a+x premier.pl
347 </example>
349 <p>En outre, si votre programme doit pouvoir acc&eacute;der en lecture
350 et/ou &eacute;criture &agrave; d'autres fichiers, ces derniers devront avoir les
351 droits appropri&eacute;s.</p>
353 </section>
355 <section id="pathinformation">
356 <title>Chemin des ex&eacute;cutables (PATH) et variables
357 d'environnement</title>
359 <p>Lorsque vous lancez un programme depuis la ligne de commande,
360 certaines informations sont pass&eacute;es au shell sans que vous vous en
361 doutiez. Par exemple, la variable <code>PATH</code> indique au
362 shell o&ugrave; il doit rechercher les ex&eacute;cutables auxquels vous faites
363 r&eacute;f&eacute;rence.</p>
365 <p>Lorsqu'un programme s'ex&eacute;cute depuis le serveur web en tant que
366 programme CGI, sa variable <code>PATH</code> n'aura peut-&ecirc;tre pas
367 la m&ecirc;me valeur. Tout programme que vous invoquez dans votre
368 programme CGI ( comme par exemple <code>sendmail</code>) devra
369 &ecirc;tre sp&eacute;cifi&eacute; par son chemin complet, de fa&ccedil;on &agrave; ce que le shell
370 puisse le trouver lorsqu'il tentera d'ex&eacute;cuter votre programme
371 CGI.</p>
373 <p>Un exemple typique de sp&eacute;cification de programme est le chemin
374 vers l'interpr&eacute;teur de script (souvent <code>perl</code>) que l'on
375 trouve &agrave; la premi&egrave;re ligne de votre programme CGI et qui va
376 ressembler &agrave; ceci :</p>
378 <example>
379 #!/usr/bin/perl
380 </example>
382 <p>Assurez-vous qu'il s'agit bien du chemin correct vers
383 l'interpr&eacute;teur.</p>
385 <p>De plus, si votre programme CGI d&eacute;pend d'autres <a
386 href="#env">variables d'environnement</a>, vous devrez vous
387 assurer qu'elles lui sont bien transmises par Apache.</p>
389 </section>
391 <section id="syntaxerrors">
392 <title>Erreurs inh&eacute;rentes au programme</title>
394 <p>La plupart des &eacute;checs dans l'ex&eacute;cution d'un programme CGI
395 proviennent du programme lui-m&ecirc;me. Ceci est particuli&egrave;rement vrai
396 lorsque ce satan&eacute; programme CGI se bloque, alors que vous avez
397 appris &agrave; ne plus commettre les deux erreurs pr&eacute;c&eacute;dentes. La
398 premi&egrave;re chose &agrave; faire est de vous assurer que votre programme
399 s'ex&eacute;cute depuis la ligne de commande, avant de le tester &agrave; partir
400 du serveur web. Par exemple, essayez :</p>
402 <example>
403 cd /usr/local/apache2/cgi-bin<br/>
404 ./premier.pl
405 </example>
407 <p>(N'invoquez pas l'interpr&eacute;teur <code>perl</code>. Le shell et
408 Apache doivent &ecirc;tre capable de le d&eacute;terminer &agrave; partir de <a
409 href="#pathinformation">l'information sur le chemin</a> situ&eacute;e sur
410 la premi&egrave;re ligne du script.)</p>
412 <p>La premi&egrave;re chose que vous devriez voir affich&eacute;e par votre
413 programme est un ensemble d'en-t&ecirc;tes HTTP, comprenant entre autres
414 le <code>Content-Type</code>, et suivi d'une ligne vide. Si vous
415 voyez quoi que ce soit d'autre, Apache renverra l'erreur
416 <code>Premature end of script headers</code> si vous tentez
417 d'ex&eacute;cuter le programme depuis le serveur. Voir <a
418 href="#writing">Ecriture d'un programme CGI</a> ci-dessus pour
419 plus de d&eacute;tails.</p>
420 </section>
422 <section id="errorlogs">
423 <title>Journalisation des erreurs</title>
425 <p>Les journaux d'erreurs sont vos amis. Toute anomalie de
426 fonctionnement est consign&eacute;e dans le journal des erreurs et c'est
427 ici que vous devez regarder en premier en cas de probl&egrave;me. Si
428 l'h&eacute;bergeur de votre site ne vous donne pas acc&egrave;s au journal des
429 erreurs, vous avez tout int&eacute;r&ecirc;t &agrave; vous tourner vers quelqu'un
430 d'autre. Apprenez &agrave; d&eacute;chiffrer les journaux d'erreurs, et vous
431 vous apercevrez que la plupart des probl&egrave;mes seront rapidement
432 identifi&eacute;s . . . et r&eacute;solus.</p>
433 </section>
435 <section id="suexec">
436 <title>Suexec</title>
438 <p>Le programme <a href="../suexec.html">suexec</a> permet
439 d'ex&eacute;cuter les programmes CGI avec des droits diff&eacute;rents selon le
440 serveur virtuel ou le r&eacute;pertoire utilisateur dans lequel ils
441 se situent. Suexec effectue une v&eacute;rification des droits tr&egrave;s
442 stricte, et toute anomalie d&eacute;tect&eacute;e au cours de cette v&eacute;rification
443 entra&icirc;nera un echec d'ex&eacute;cution de votre programme CGI avec
444 affichage de l'erreur <code>Premature end of script
445 headers</code>.</p>
447 <p>Pour savoir si vous pouvez utiliser suexec, tapez la commande
448 <code>apachectl -V</code>, et regardez le chemin indiqu&eacute; par
449 <code>SUEXEC_BIN</code>. Si au d&eacute;marrage d'Apache, ce dernier
450 trouve un ex&eacute;cutable <program>suexec</program> dans ce chemin,
451 suexec sera activ&eacute;.</p>
453 <p>Si vous ne ma&icirc;trisez pas le fonctionnement de suexec, il vous
454 est d&eacute;conseill&eacute; de l'utiliser. Pour d&eacute;sactiver suexec, supprimer
455 simplement (ou renommez) l'ex&eacute;cutable <program>suexec</program>
456 point&eacute; par <code>SUEXEC_BIN</code> et red&eacute;marrez le serveur. Si
457 apr&egrave;s une lecture de <a href="../suexec.html">suexec</a>, vous
458 d&eacute;cidez quand-m&ecirc;me de l'utiliser, tapez la commande <code>suexec
459 -V</code> pour voir o&ugrave; se situe le journal de suexec, et utilisez
460 ce dernier pour d&eacute;terminer quelles r&egrave;gles vous violez
461 &eacute;ventuellement.</p>
462 </section>
463 </section>
465 <section id="behindscenes">
466 <title>Que se passe-t-il en coulisse</title>
468 <p>Lorsque vos comp&eacute;tences en programmation CGI seront plus
469 pouss&eacute;es, il s'av&eacute;rera int&eacute;ressant pour vous de mieux comprendre ce
470 qui se passe en coulisse, et en particulier la mani&egrave;re dont le
471 navigateur et le serveur dialoguent entre eux. En effet, bien qu'il
472 soit tout &agrave; fait louable d'&eacute;crire un programme qui affiche "Bonjour
473 tout le monde . . .", cela ne sert pas &agrave; grand chose.</p>
475 <section id="env">
476 <title>Variables d'environnement</title>
478 <p>Les variables d'environnement sont des valeurs qui gravitent
479 autour de vous lorsque vous utilisez votre ordinateur. Elles sont
480 tr&egrave;s utiles, &agrave; l'instar de votre chemin par d&eacute;faut (o&ugrave; votre
481 ordinateur va rechercher le fichier physique correspondant &agrave; la
482 commande que vous avez tap&eacute;e), votre nom d'utilisateur, le type de
483 votre terminal, etc... Pour obtenir une liste compl&egrave;te des
484 variables d'environnement standards que vous utilisez tous les
485 jours, tapez <code>env</code> dans votre interpr&eacute;teur
486 de commandes.</p>
488 <p>Au cours de la transaction CGI, le serveur et le navigateur
489 d&eacute;finissent aussi des variables d'environnement, de fa&ccedil;on &agrave; ce
490 qu'ils puissent communiquer entre eux. Ces variables d&eacute;finissent
491 entre autre le type de navigateur (Netscape, IE, Lynx), le type de
492 serveur (Apache, IIS, WebSite), le nom du programme CGI en cours
493 d'ex&eacute;cution, etc...</p>
495 <p>Ces variables sont &agrave; la disposition du programmeur CGI, et
496 elles constituent 50% de la communication client-serveur. La liste
497 compl&egrave;te des variables requises se trouve &agrave;
498 <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html"
499 >http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>.</p>
501 <p>Ce programme CGI basique en Perl permet d'afficher toutes les
502 variables d'environnement qui sont &eacute;chang&eacute;es. Deux programmes
503 similaires sont fournis avec la distribution d'Apache et situ&eacute;s
504 dans le r&eacute;pertoire <code>cgi-bin</code>.
505 Notez que certaines variables sont
506 obligatoires, alors que d'autres sont optionnelles, si bien que
507 vous verrez s'afficher certaines variables qui ne font pas partie
508 de la liste officielle. De plus, Apache vous propose de nombreuses
509 m&eacute;thodes pour <a href="../env.html">ajouter vos propres
510 variables d'environnement</a> aux variables de base fournies par
511 d&eacute;faut.</p>
513 <example>
514 #!/usr/bin/perl<br />
515 print "Content-type: text/html\n\n";<br />
516 foreach $key (keys %ENV) {<br />
517 <indent>
518 print "$key --&gt; $ENV{$key}&lt;br&gt;";<br />
519 </indent>
521 </example>
522 </section>
524 <section id="stdin">
525 <title>STDIN et STDOUT</title>
527 <p>L'entr&eacute;e standard (<code>STDIN</code>) et la sortie standard
528 (<code>STDOUT</code>) constituent d'autres voies de communication
529 entre le client et le serveur. Dans un contexte normal,
530 <code>STDIN</code> correspond au clavier, ou &agrave; un fichier fourni
531 au programme &agrave; des fins de traitement, et <code>STDOUT</code> &agrave; la
532 console ou &agrave; l'&eacute;cran.</p>
534 <p>Lorsque vous transmettez un formulaire web &agrave; un programme CGI
535 par la m&eacute;thode <code>POST</code>, les donn&eacute;es de ce formulaire
536 sont transcrites dans un format sp&eacute;cial et transmises &agrave; votre
537 programme CGI via <code>STDIN</code>. Le programme peut alors les
538 traiter comme si elles provenaient du clavier ou d'un
539 fichier.</p>
541 <p>Ce "format sp&eacute;cial" est tr&egrave;s simple. Un nom de champ et sa
542 valeur sont reli&eacute;s entre eux par un signe "&eacute;gal" (=), et chacune
543 de ces paires nom champ/valeur est s&eacute;par&eacute;e de la suivante par un
544 "et" commercial (&amp;). Les caract&egrave;res
545 sp&eacute;ciaux comme les espaces, les "et" commerciaux, et les signes
546 "&eacute;gal" sont convertis en leur &eacute;quivalent hexad&eacute;cimal pour &eacute;viter
547 qu'ils ne g&acirc;chent le travail. La cha&icirc;ne contenant les donn&eacute;es doit
548 ressembler &agrave; ceci :</p>
550 <example>
551 name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
552 </example>
554 <p>Vous verrez aussi parfois une cha&icirc;ne de ce type accol&eacute;e &agrave; une
555 URL. Dans ce cas, le serveur enregistre cette cha&icirc;ne dans la
556 variable d'environnement appel&eacute;e <code>QUERY_STRING</code>. On a
557 alors affaire &agrave; une requ&ecirc;te de type <code>GET</code>. Votre
558 formulaire HTML indique laquelle des m&eacute;thodes <code>GET</code> ou
559 <code>POST</code> est utilis&eacute;e pour transmettre les donn&eacute;es, en
560 d&eacute;finissant l'attribut <code>METHOD</code> au niveau de la balise
561 <code>FORM</code>.</p>
563 <p>Votre programme est ensuite charg&eacute; d'extraire les informations
564 utiles de cette cha&icirc;ne. Heureusement, des biblioth&egrave;ques et des
565 modules sont &agrave; votre disposition pour vous aider &agrave; traiter ces
566 donn&eacute;es, et &agrave; g&eacute;rer les diff&eacute;rents aspects de votre programme
567 CGI.</p>
568 </section>
569 </section>
570 <!-- reprendre ici -->
571 <section id="libraries">
572 <title>Biblioth&egrave;ques et modules CGI</title>
574 <p>Pour &eacute;crire un programme CGI, il vous est conseill&eacute; d'utiliser
575 une biblioth&egrave;que de code, ou un module, qui effectueront une grande
576 partie du travail de base pour vous. Ceci vous permettra de diminuer
577 le nombre d'erreurs et d'acc&eacute;l&eacute;rer le d&eacute;veloppement.</p>
579 <p>Si vous &eacute;crivez des programmes CGI en Perl, des modules sont &agrave;
580 votre disposition &agrave; <a href="http://www.cpan.org/">CPAN</a>. A ce
581 sujet, le module le plus populaire est <code>CGI.pm</code>. Vous
582 pouvez aussi essayer <code>CGI::Lite</code>, qui impl&eacute;mente les
583 fonctionnalit&eacute;s strictement n&eacute;cessaires, mais suffisantes pour
584 la majorit&eacute; des programmes.</p>
586 <p>Si vous &eacute;crivez des programmes CGI en C, vous disposez de
587 nombreuses options. L'une d'elles est la biblioth&egrave;que
588 <code>CGIC</code> de <a href="http://www.boutell.com/cgic/"
589 >http://www.boutell.com/cgic/</a>.</p>
590 </section>
592 <section id="moreinfo">
593 <title>Pour plus d'informations</title>
595 <p>Il existe un grand nombre de ressources CGI sur le web. Vous
596 pouvez discuter de probl&egrave;mes CGI avec d'autres utilisateurs dans le
597 groupe Usenet <a href="news:comp.infosystems.www.authoring.cgi">
598 comp.infosystems.www.authoring.cgi</a>. En outre, la liste de
599 diffusion de la Guilde des Ecrivains HTML est une source
600 intarissable de r&eacute;ponses &agrave; vos questions. Vous en saurez plus en
601 vous rendant &agrave; <a href="http://www.hwg.org/lists/hwg-servers/"
602 >http://www.hwg.org/lists/hwg-servers/</a>.</p>
604 <p>Et bien entendu, vous devez lire la sp&eacute;cification CGI, qui
605 pr&eacute;sente tous les d&eacute;tails en rapport avec les op&eacute;rations des
606 programmes CGI. La version originale se trouve au <a
607 href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a>, et
608 dans la RFC IETF actuelle <a
609 href="http://www.ietf.org/rfc/rfc3875">Common Gateway
610 Interface RFC</a>.</p>
612 <p>Lorsque vous postez une question &agrave; propos d'un probl&egrave;me CGI que
613 vous rencontrez, que ce soit dans une liste de diffusion ou dans un
614 newsgroup, faites en sorte de fournir suffisamment d'informations
615 sur le probl&egrave;me rencontr&eacute;, ce que vous attendiez exactement, et en
616 quoi ce qui se produit est r&eacute;ellement diff&eacute;rent de ce que vous
617 attendiez, quel serveur vous utilisez, en quel langage votre
618 programme CGI a &eacute;t&eacute; &eacute;crit, et, si possible, son code source. Ceci
619 permettra une r&eacute;solution plus ais&eacute;e de votre probl&egrave;me.</p>
621 <p>Notez que les questions &agrave; propos de probl&egrave;mes CGI ne doivent
622 <strong>jamais</strong> &ecirc;tre post&eacute;es dans la base de donn&eacute;es de
623 bogues d'Apache, &agrave; moins que vous ne soyez s&ucirc;r d'avoir trouv&eacute; un
624 probl&egrave;me dans le code source d'Apache.</p>
625 </section>
626 </manualpage>