]> granicus.if.org Git - apache/blob - docs/manual/howto/cgi.html.fr
xforms
[apache] / docs / manual / howto / cgi.html.fr
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="fr" xml:lang="fr"><head><!--
4         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5               This file is generated from xml source: DO NOT EDIT
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7       -->
8 <title>Tutoriel Apache : Contenu dynamique basé sur CGI - Serveur Apache HTTP</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" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
12 <script src="../style/scripts/prettify.js" type="text/javascript">
13 </script>
14
15 <link href="../images/favicon.ico" rel="shortcut icon" /></head>
16 <body id="manual-page"><div id="page-header">
17 <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">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p>
18 <p class="apache">Serveur Apache HTTP Version 2.5</p>
19 <img alt="" src="../images/feather.gif" /></div>
20 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
21 <div id="path">
22 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Recettes et tutoriels</a></div><div id="page-content"><div id="preamble"><h1>Tutoriel Apache : Contenu dynamique basé sur CGI</h1>
23 <div class="toplang">
24 <p><span>Langues Disponibles: </span><a href="../en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
25 <a href="../fr/howto/cgi.html" title="Français">&nbsp;fr&nbsp;</a> |
26 <a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
27 <a href="../ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
28 </div>
29 </div>
30 <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#intro">Introduction</a></li>
31 <li><img alt="" src="../images/down.gif" /> <a href="#configuring">Configurer Apache pour autoriser CGI</a></li>
32 <li><img alt="" src="../images/down.gif" /> <a href="#writing">Ecrire un programme CGI</a></li>
33 <li><img alt="" src="../images/down.gif" /> <a href="#troubleshoot">Mais ça ne marche toujours pas !</a></li>
34 <li><img alt="" src="../images/down.gif" /> <a href="#behindscenes">Que se passe-t-il en coulisse</a></li>
35 <li><img alt="" src="../images/down.gif" /> <a href="#libraries">Bibliothèques et modules CGI</a></li>
36 <li><img alt="" src="../images/down.gif" /> <a href="#moreinfo">Pour plus d'informations</a></li>
37 </ul><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
38 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
39 <div class="section">
40 <h2><a name="intro" id="intro">Introduction</a></h2>
41     
42
43     <table class="related"><tr><th>Modules Apparentés</th><th>Directives Apparentées</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>
44
45     <p>CGI (Common Gateway Interface) définit une méthode d'interaction
46     entre un serveur web et des programmes générateurs de contenu
47     externes, plus souvent appelés programmes CGI ou scripts CGI. Il
48     s'agit de la méthode la plus simple, et la plus
49     courante, pour ajouter du contenu dynamique à votre site web. Ce
50     document est une introduction à la configuration de CGI sur votre
51     serveur web Apache, et une initiation à l'écriture de programmes
52     CGI.</p>
53   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
54 <div class="section">
55 <h2><a name="configuring" id="configuring">Configurer Apache pour autoriser CGI</a></h2>
56     
57
58     <p>Apache doit être configuré pour permettre l'exécution des
59     programmes CGI, pour que vos programmes CGI puissent fonctionner
60     correctement. Il existe plusieurs méthodes pour y parvenir.</p>
61
62     <div class="warning">Note: si Apache a été compilé avec le support
63     des modules partagés (DSO), vous devez vous assurer que le module CGI est
64     chargé ; vous devez pour cela vérifier que la directive <code class="directive"><a href="../mod/mod_so.html#loadmodule">LoadModule</a></code> correspondante n'a pas été
65     commentée dans votre <code>httpd.conf</code>. Une directive correcte
66     doit ressembler à ceci :
67
68     <pre class="prettyprint lang-config">
69       LoadModule cgi_module modules/mod_cgi.so
70     </pre>
71 </div>
72
73     <h3><a name="scriptalias" id="scriptalias">ScriptAlias</a></h3>
74       
75
76       <p>La directive <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code> indique à Apache qu'un
77       répertoire particulier est dédié aux programmes CGI. Apache
78       considérera que tout fichier situé dans ce répertoire est un
79       programme CGI, et tentera de l'exécuter lorsque cette ressource
80       fera l'objet d'une requête client.</p>
81
82       <p>La directive <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code> se présente comme suit
83       :</p>
84
85       <pre class="prettyprint lang-config">
86         ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
87       </pre>
88
89
90       <p>Cet exemple est tiré de votre fichier de configuration
91       <code>httpd.conf</code> par défaut, si vous avez installé Apache
92       dans son répertoire par défaut. La directive <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code> est similaire à la
93       directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>, qui
94       définit à quel répertoire particulier doit correspondre un préfixe
95       d'URL. <code class="directive">Alias</code> et
96       <code class="directive">ScriptAlias</code> sont généralement utilisés pour
97       accéder à des répertoires situés en dehors du répertoire défini
98       par la directive <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>. La différence entre
99       <code class="directive">Alias</code> et <code class="directive">ScriptAlias</code>
100       réside dans le fait que <code class="directive">ScriptAlias</code> indique
101       en plus que tout ce qui se trouve sous le préfixe d'URL doit être
102       considéré comme un programme CGI. Ainsi, l'exemple ci-dessus
103       indique à Apache que toute requête pour une ressource commençant
104       par <code>/cgi-bin/</code> doit être servie depuis le répertoire
105       <code>/usr/local/apache2/cgi-bin/</code>, et doit être traitée en
106       tant que programme CGI.</p>
107
108       <p>Par exemple, si une requête pour l'URL
109       <code>http://www.example.com/cgi-bin/test.pl</code> est
110       effectuée, Apache tentera d'exécuter le fichier
111       <code>/usr/local/apache2/cgi-bin/test.pl</code> et en renverra la
112       sortie. Bien entendu, le fichier doit exister, être exécutable, et
113       retourner sa sortie d'une manière particulière, sinon Apache
114       renverra un message d'erreur.</p>
115     
116
117     <h3><a name="nonscriptalias" id="nonscriptalias">CGI en dehors des répertoires ScripAlias</a></h3>
118       
119
120       <p>Pour des raisons de sécurité, la localisation des programmes
121       CGI est souvent restreinte aux
122       répertoires définis par <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>. De cette manière, les administrateurs
123       peuvent contrôler précisément qui est autorisé à utiliser les
124       programmes CGI. Cependant, si les précautions adéquates quant à
125       la sécurité sont prises, il n'y a aucune raison pour que les
126       programmes CGI ne puissent pas être exécutés depuis d'autres
127       répertoires. Par exemple, vous pouvez autoriser les utilisateurs à
128       enregistrer des contenus web dans leurs répertoires home à l'aide
129       de la directive <code class="directive"><a href="../mod/mod_userdir.html#userdir">UserDir</a></code>. S'ils veulent mettre en
130       oeuvre leurs propres programmes CGI, mais n'ont pas l'autorisation
131       d'accès au répertoire <code>cgi-bin</code> principal, ils devront
132       être en mesure d'exécuter ces programmes depuis un autre
133       répertoire.</p>
134
135       <p>L'autorisation d'exécution des programmes CGI dans un
136       répertoire arbitraire se fait en deux étapes. En premier lieu, le
137       gestionnaire <code>cgi-script</code> doit être activé à l'aide
138       d'une directive <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> ou <code class="directive"><a href="../mod/core.html#sethandler">SetHandler</a></code>. En second lieu,
139       <code>ExecCGI</code> doit être spécifié dans la directive <code class="directive"><a href="../mod/core.html#options">Options</a></code>.</p>
140     
141
142     <h3><a name="options" id="options">Utilisation d'options explicites pour permettre l'exécution
143       des programmes CGI</a></h3>
144       
145
146       <p>Vous pouvez utiliser de manière explicite la directive
147       <code class="directive"><a href="../mod/core.html#options">Options</a></code> dans le fichier de
148       configuration de votre serveur principal, pour indiquer que
149       l'exécution des programmes CGI est permise depuis un répertoire
150       particulier :</p>
151
152       <pre class="prettyprint lang-config">
153 &lt;Directory /usr/local/apache2/htdocs/somedir&gt;
154     Options +ExecCGI
155 &lt;/Directory&gt;
156       </pre>
157
158
159       <p>La directive ci-dessus indique à Apache qu'il doit permettre
160       l'exécution des fichiers CGI. Vous devez aussi indiquer au serveur
161       quels fichiers sont des fichiers CGI. La directive <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> suivante indique au
162       serveur qu'il doit traiter tous les fichiers possédant une
163       extension <code>cgi</code> ou <code>pl</code> en tant que
164       programmes CGI :</p>
165
166       <pre class="prettyprint lang-config">
167         AddHandler cgi-script .cgi .pl
168       </pre>
169
170     
171
172     <h3><a name="htaccess" id="htaccess">Fichiers .htaccess</a></h3>
173       
174
175       <p>Le <a href="htaccess.html"><code>tutoriel
176       .htaccess</code></a> montre comment activer les programmes
177       CGI si vous n'avez pas accès au
178       fichier <code>httpd.conf</code>.</p>
179     
180
181     <h3><a name="userdir" id="userdir">Répertoires utilisateurs</a></h3>
182       
183
184       <p>Pour permettre l'exécution en tant que programme CGI de tout
185       fichier possédant l'extension <code>.cgi</code> et situé dans un
186       répertoire utilisateur, vous pouvez utiliser la configuration
187       suivante :</p>
188
189       <pre class="prettyprint lang-config">
190 &lt;Directory /home/*/public_html&gt;
191     Options +ExecCGI
192     AddHandler cgi-script .cgi
193 &lt;/Directory&gt;
194       </pre>
195
196
197       <p>Pour indiquer un sous-répertoire <code>cgi-bin</code> d'un
198       répertoire utilisateur où tout fichier sera traité en tant que
199       programme CGI, vous pouvez utiliser ceci :</p>
200
201       <pre class="prettyprint lang-config">
202 &lt;Directory /home/*/public_html/cgi-bin&gt;
203     Options ExecCGI
204     SetHandler cgi-script
205 &lt;/Directory&gt;
206       </pre>
207
208
209     
210
211   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
212 <div class="section">
213 <h2><a name="writing" id="writing">Ecrire un programme CGI</a></h2>
214     
215
216     <p>Il y a deux différences principales entre la programmation
217     "standard" et la programmation CGI.</p>
218
219     <p>En premier lieu, toute sortie de votre programme CGI doit être
220     précédée d'un en-tête <a class="glossarylink" href="../glossary.html#mime-type" title="voir glossaire">MIME-type</a>. Il s'agit d'un
221     en-tête HTTP qui indique au client quel type de contenu il reçoit.
222     La plupart du temps, il se présente comme suit :</p>
223
224     <div class="example"><p><code>
225       Content-type: text/html
226     </code></p></div>
227
228     <p>En second lieu, votre sortie doit être en HTML, ou tout autre
229     format qu'un navigateur est en mesure d'afficher. La plupart du
230     temps, il s'agira de HTML, mais occasionnellement, vous pouvez être
231     amené à écrire un programme CGI qui renvoie une image gif, ou un
232     autre type de contenu non-HTML.</p>
233
234     <p>A part ces deux différences, un programme CGI ressemblera à tout
235     autre programme que vous pourriez être amené à écrire.</p>
236
237     <h3><a name="firstcgi" id="firstcgi">Votre premier programme CGI</a></h3>
238       
239
240       <p>L'exemple suivant est un exemple de programme CGI qui permet
241       d'afficher une ligne de caractères dans votre navigateur. Ecrivez
242       ce qui suit, enregistrez le dans un fichier nommé
243       <code>premier.pl</code>, et placez le dans votre répertoire
244       <code>cgi-bin</code>.</p>
245
246       <pre class="prettyprint lang-perl">
247 #!/usr/bin/perl
248 print "Content-type: text/html\n\n";
249 print "Hello, World.";
250       </pre>
251
252
253       <p>Même si Perl ne vous est pas familier, vous devriez être
254       capable de comprendre le fonctionnement de ce programme. La
255       première ligne indique à Apache (ou à toute interface à partir de
256       laquelle le programme s'exécute) que ce programme peut être
257       exécuté en fournissant son fichier à l'interpréteur
258       <code>/usr/bin/perl</code>. La seconde ligne affiche la
259       déclaration du type de contenu considéré, suivie de deux paires
260       "Retour chariot - Nouvelle ligne". Ceci a pour effet d'insérer une
261       ligne vide après l'en-tête pour marquer la fin des en-têtes HTTP,
262       et le début du corps du document. La troisième ligne affiche la
263       chaîne de caractères "Bonjour tout le monde . . .". Et c'est tout
264       ce dont vous avez besoin.</p>
265
266       <p>Si vous ouvrez votre navigateur favori et lui indiquez
267       l'adresse</p>
268
269       <div class="example"><p><code>
270         http://www.example.com/cgi-bin/premier.pl
271       </code></p></div>
272
273       <p>ou toute autre URL correspondant à votre programme CGI, Vous
274       verrez la ligne <code>Bonjour tout le monde . . .</code>
275       s'afficher dans la fenêtre de votre navigateur. Ce n'est pas
276       extraordinaire, mais si vous y êtes parvenu, vous avez de bonnes
277       chances d'y parvenir pour tout autre programme plus
278       sophistiqué.</p>
279     
280   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
281 <div class="section">
282 <h2><a name="troubleshoot" id="troubleshoot">Mais ça ne marche toujours pas !</a></h2>
283     
284
285     <p>Vous devriez voir au moins une des quatre sorties suivantes dans
286     votre navigateur lorsque vous essayez d'accéder à votre programme
287     CGI depuis le web :</p>
288
289     <dl>
290       <dt>Le flux de sortie de votre programme CGI</dt>
291       <dd>Impeccable ! Cela signifie que tout fonctionne correctement.
292       Si la sortie est correcte mais n'est pas traitée correctement par
293       le navigateur, assurez-vous d'avoir défini
294       <code>Content-Type</code> de manière appropriée dans votre
295       programme CGI.</dd>
296
297       <dt>Le code source de votre programme CGI ou un message "POST
298       Method Not Allowed"</dt>
299       <dd>Cela signifie que vous n'avez pas configuré Apache de manière
300       à ce qu'il puisse traiter votre programme CGI. Relisez la section
301       sur la <a href="#configuring">configuration d'Apache</a>, et
302       essayez de trouver votre erreur.</dd>
303
304       <dt>Un message commençant par "Forbidden"</dt>
305       <dd>Ce type de message est révélateur d'un problème de
306       droits. Consultez le <a href="#errorlogs">journal des erreurs
307       d'Apache</a> et la section ci-dessous sur les <a href="#permissions">droits des fichiers</a>.</dd>
308
309       <dt>Un message contenant "Internal Server Error"</dt>
310       <dd>Si vous consultez le <a href="#errorlogs">journal des erreurs
311       d'Apache</a>, vous y trouverez probablement des messages du type
312       "Premature end of script headers" (Fin prématurée des en-têtes de
313       script), éventuellement accompagnés d'un message d'erreur généré
314       par votre programme CGI. Dans ce cas, il va vous falloir lire
315       chacune des sections ci-dessous pour déterminer ce qui empêche
316       votre programme CGI de générer les en-têtes appropriés.</dd>
317     </dl>
318
319     <h3><a name="permissions" id="permissions">Droits des fichiers</a></h3>
320       
321
322       <p>Souvenez-vous que le serveur ne s'exécute pas sous votre nom.
323       En d'autres termes, lorsque le serveur a démarré, il s'exécute
324       avec les droits d'un utilisateur non privilégié - en général
325       <code>nobody</code>, ou <code>www</code> - et en conséquence, il
326       aura besoin de droits supplémentaires pour pouvoir exécuter des
327       fichiers dont vous êtes le propriétaire. En général, pour qu'un
328       fichier ait des droits suffisants pour être exécutable par
329       <code>nobody</code>, il suffit de lui attribuer des droits
330       d'exécution pour tout le monde :</p>
331
332       <div class="example"><p><code>
333         chmod a+x premier.pl
334       </code></p></div>
335
336       <p>En outre, si votre programme doit pouvoir accéder en lecture
337       et/ou écriture à d'autres fichiers, ces derniers devront avoir les
338       droits appropriés.</p>
339
340     
341
342     <h3><a name="pathinformation" id="pathinformation">Chemin des exécutables (PATH) et variables
343       d'environnement</a></h3>
344       
345
346       <p>Lorsque vous lancez un programme depuis la ligne de commande,
347       certaines informations sont passées au shell sans que vous vous en
348       doutiez. Par exemple, la variable <code>PATH</code> indique au
349       shell où il doit rechercher les exécutables auxquels vous faites
350       référence.</p>
351
352       <p>Lorsqu'un programme s'exécute depuis le serveur web en tant que
353       programme CGI, sa variable <code>PATH</code> n'aura peut-être pas
354       la même valeur. Tout programme que vous invoquez dans votre
355       programme CGI ( comme par exemple <code>sendmail</code>) devra
356       être spécifié par son chemin complet, de façon à ce que le shell
357       puisse le trouver lorsqu'il tentera d'exécuter votre programme
358       CGI.</p>
359
360       <p>Un exemple typique de spécification de programme est le chemin
361       vers l'interpréteur de script (souvent <code>perl</code>) que l'on
362       trouve à la première ligne de votre programme CGI et qui va
363       ressembler à ceci :</p>
364
365       <pre class="prettyprint lang-perl">
366         #!/usr/bin/perl
367       </pre>
368
369
370       <p>Assurez-vous qu'il s'agit bien du chemin correct vers
371       l'interpréteur.</p>
372
373       <div class="warning">
374       Lors de l'édition de scripts CGI sous Windows, il se peut que des
375       caractères de fin de ligne soient ajoutés au chemin de
376       l'interpréteur. Assurez-vous donc que les fichiers sont bien
377       transmis au serveur en mode ASCII. Dans le cas contraire, l'OS
378       pourra envoyer des avertissements "Command not found" à cause des
379       caractères de fin de ligne non reconnus car considérés comme
380       faisant partie du nom de fichier de l'interpréteur.
381       </div>
382
383       
384
385     <h3><a name="missingenv" id="missingenv">Variables d'environnement manquantes</a></h3>
386       
387
388       <p>Si votre programme CGI dépend de <a href="#env">variables
389       d'environnement</a> non standards, vous devrez vous assurez que
390       ces variables lui sont bien transmises par Apache.</p>
391
392       <p>Lorsque des en-têtes HTTP ne sont pas transmis à
393       l'environnement, assurez-vous qu'ils sont bien formatés selon la
394       <a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a>, section
395       4.2 : les noms d'en-têtes doivent commencer par une lettre,
396       elle-même suivie de lettres, chiffres ou traits d'union. Tout
397       en-tête dont le nom viole cette règle sera ignoré.</p>
398
399     
400
401     <h3><a name="syntaxerrors" id="syntaxerrors">Erreurs inhérentes au programme</a></h3>
402       
403
404       <p>La plupart des échecs dans l'exécution d'un programme CGI
405       proviennent du programme lui-même. Ceci est particulièrement vrai
406       lorsque ce satané programme CGI se bloque, alors que vous avez
407       appris à ne plus commettre les deux erreurs précédentes. La
408       première chose à faire est de vous assurer que votre programme
409       s'exécute depuis la ligne de commande, avant de le tester à partir
410       du serveur web. Par exemple, essayez :</p>
411
412       <div class="example"><p><code>
413       cd /usr/local/apache2/cgi-bin<br />
414       ./premier.pl
415       </code></p></div>
416
417       <p>(N'invoquez pas l'interpréteur <code>perl</code>. Le shell et
418       Apache doivent être capable de le déterminer à partir de <a href="#pathinformation">l'information sur le chemin</a> située sur
419       la première ligne du script.)</p>
420
421       <p>La première chose que vous devriez voir affichée par votre
422       programme est un ensemble d'en-têtes HTTP, comprenant entre autres
423       le <code>Content-Type</code>, et suivi d'une ligne vide. Si vous
424       voyez quoi que ce soit d'autre, Apache renverra l'erreur
425       <code>Premature end of script headers</code> si vous tentez
426       d'exécuter le programme depuis le serveur. Voir <a href="#writing">Ecriture d'un programme CGI</a> ci-dessus pour
427       plus de détails.</p>
428     
429
430     <h3><a name="errorlogs" id="errorlogs">Journalisation des erreurs</a></h3>
431       
432
433       <p>Les journaux d'erreurs sont vos amis. Toute anomalie de
434       fonctionnement est consignée dans le journal des erreurs et c'est
435       ici que vous devez regarder en premier en cas de problème. Si
436       l'hébergeur de votre site ne vous donne pas accès au journal des
437       erreurs, vous avez tout intérêt à vous tourner vers quelqu'un
438       d'autre. Apprenez à déchiffrer les journaux d'erreurs, et vous
439       vous apercevrez que la plupart des problèmes seront rapidement
440       identifiés . . . et résolus.</p>
441     
442
443     <h3><a name="suexec" id="suexec">Suexec</a></h3>
444       
445
446       <p>Le programme <a href="../suexec.html">suexec</a> permet
447       d'exécuter les programmes CGI avec des droits différents selon le
448       serveur virtuel ou le répertoire utilisateur dans lequel ils
449       se situent. Suexec effectue une vérification des droits très
450       stricte, et toute anomalie détectée au cours de cette vérification
451       entraînera un echec d'exécution de votre programme CGI avec
452       affichage de l'erreur <code>Premature end of script
453       headers</code>.</p>
454
455       <p>Pour savoir si vous pouvez utiliser suexec, tapez la commande
456       <code>apachectl -V</code>, et regardez le chemin indiqué par
457       <code>SUEXEC_BIN</code>. Si au démarrage d'Apache, ce dernier
458       trouve un exécutable <code class="program"><a href="../programs/suexec.html">suexec</a></code> dans ce chemin,
459       suexec sera activé.</p>
460
461       <p>Si vous ne maîtrisez pas le fonctionnement de suexec, il vous
462       est déconseillé de l'utiliser. Pour désactiver suexec, supprimer
463       simplement (ou renommez) l'exécutable <code class="program"><a href="../programs/suexec.html">suexec</a></code>
464       pointé par <code>SUEXEC_BIN</code> et redémarrez le serveur. Si
465       après une lecture de <a href="../suexec.html">suexec</a>, vous
466       décidez quand-même de l'utiliser, tapez la commande <code>suexec
467       -V</code> pour voir où se situe le journal de suexec, et utilisez
468       ce dernier pour déterminer quelles règles vous violez
469       éventuellement.</p>
470     
471   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
472 <div class="section">
473 <h2><a name="behindscenes" id="behindscenes">Que se passe-t-il en coulisse</a></h2>
474     
475
476     <p>Lorsque vos compétences en programmation CGI seront plus
477     poussées, il s'avérera intéressant pour vous de mieux comprendre ce
478     qui se passe en coulisse, et en particulier la manière dont le
479     navigateur et le serveur dialoguent entre eux. En effet, bien qu'il
480     soit tout à fait louable d'écrire un programme qui affiche "Bonjour
481     tout le monde . . .", cela ne sert pas à grand chose.</p>
482
483     <h3><a name="env" id="env">Variables d'environnement</a></h3>
484       
485
486       <p>Les variables d'environnement sont des valeurs qui gravitent
487       autour de vous lorsque vous utilisez votre ordinateur. Elles sont
488       très utiles, à l'instar de votre chemin par défaut (où votre
489       ordinateur va rechercher le fichier physique correspondant à la
490       commande que vous avez tapée), votre nom d'utilisateur, le type de
491       votre terminal, etc... Pour obtenir une liste complète des
492       variables d'environnement standards que vous utilisez tous les
493       jours, tapez <code>env</code> dans votre interpréteur
494       de commandes.</p>
495
496       <p>Au cours de la transaction CGI, le serveur et le navigateur
497       définissent aussi des variables d'environnement, de façon à ce
498       qu'ils puissent communiquer entre eux. Ces variables définissent
499       entre autre le type de navigateur (Netscape, IE, Lynx), le type de
500       serveur (Apache, IIS, WebSite), le nom du programme CGI en cours
501       d'exécution, etc...</p>
502
503       <p>Ces variables sont à la disposition du programmeur CGI, et
504       elles constituent 50% de la communication client-serveur. La liste
505       complète des variables requises se trouve à
506       <a href="http://www.ietf.org/rfc/rfc3875">Common Gateway
507       Interface RFC</a>.</p>
508
509       <p>Ce programme CGI basique en Perl permet d'afficher toutes les
510       variables d'environnement qui sont échangées. Deux programmes
511       similaires sont fournis avec la distribution d'Apache et situés
512       dans le répertoire <code>cgi-bin</code>.
513       Notez que certaines variables sont
514       obligatoires, alors que d'autres sont optionnelles, si bien que
515       vous verrez s'afficher certaines variables qui ne font pas partie
516       de la liste officielle. De plus, Apache vous propose de nombreuses
517       méthodes pour <a href="../env.html">ajouter vos propres
518       variables d'environnement</a> aux variables de base fournies par
519       défaut.</p>
520
521       <pre class="prettyprint lang-perl">
522 #!/usr/bin/perl
523 use strict;
524 use warnings;
525
526 print "Content-type: text/html\n\n";
527 foreach my $key (keys %ENV) {
528     print "$key --&gt; $ENV{$key}&lt;br&gt;";
529 }
530       </pre>
531
532     
533
534     <h3><a name="stdin" id="stdin">STDIN et STDOUT</a></h3>
535       
536
537       <p>L'entrée standard (<code>STDIN</code>) et la sortie standard
538       (<code>STDOUT</code>) constituent d'autres voies de communication
539       entre le client et le serveur. Dans un contexte normal,
540       <code>STDIN</code> correspond au clavier, ou à un fichier fourni
541       au programme à des fins de traitement, et <code>STDOUT</code> à la
542       console ou à l'écran.</p>
543
544       <p>Lorsque vous transmettez un formulaire web à un programme CGI
545       par la méthode <code>POST</code>, les données de ce formulaire
546       sont transcrites dans un format spécial et transmises à votre
547       programme CGI via <code>STDIN</code>. Le programme peut alors les
548       traiter comme si elles provenaient du clavier ou d'un
549       fichier.</p>
550
551       <p>Ce "format spécial" est très simple. Un nom de champ et sa
552       valeur sont reliés entre eux par un signe "égal" (=), et chacune
553       de ces paires nom champ/valeur est séparée de la suivante par un
554       "et" commercial (&amp;). Les caractères
555       spéciaux comme les espaces, les "et" commerciaux, et les signes
556       "égal" sont convertis en leur équivalent hexadécimal pour éviter
557       qu'ils ne gâchent le travail. La chaîne contenant les données doit
558       ressembler à ceci :</p>
559
560       <div class="example"><p><code>
561         name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
562       </code></p></div>
563
564       <p>Vous verrez aussi parfois une chaîne de ce type accolée à une
565       URL. Dans ce cas, le serveur enregistre cette chaîne dans la
566       variable d'environnement appelée <code>QUERY_STRING</code>. On a
567       alors affaire à une requête de type <code>GET</code>. Votre
568       formulaire HTML indique laquelle des méthodes <code>GET</code> ou
569       <code>POST</code> est utilisée pour transmettre les données, en
570       définissant l'attribut <code>METHOD</code> au niveau de la balise
571       <code>FORM</code>.</p>
572
573       <p>Votre programme est ensuite chargé d'extraire les informations
574       utiles de cette chaîne. Heureusement, des bibliothèques et des
575       modules sont à votre disposition pour vous aider à traiter ces
576       données, et à gérer les différents aspects de votre programme
577       CGI.</p>
578     
579   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
580 <div class="section">
581 <h2><a name="libraries" id="libraries">Bibliothèques et modules CGI</a></h2>
582     
583
584     <p>Pour écrire un programme CGI, il vous est conseillé d'utiliser
585     une bibliothèque de code, ou un module, qui effectueront une grande
586     partie du travail de base pour vous. Ceci vous permettra de diminuer
587     le nombre d'erreurs et d'accélérer le développement.</p>
588
589     <p>Si vous écrivez des programmes CGI en Perl, des modules sont à
590     votre disposition à <a href="http://www.cpan.org/">CPAN</a>. A ce
591     sujet, le module le plus populaire est <code>CGI.pm</code>. Vous
592     pouvez aussi essayer <code>CGI::Lite</code>, qui implémente les
593     fonctionnalités strictement nécessaires, mais suffisantes pour
594     la majorité des programmes.</p>
595
596     <p>Si vous écrivez des programmes CGI en C, vous disposez de
597     nombreuses options. L'une d'elles est la bibliothèque
598     <code>CGIC</code> de <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>.</p>
599   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
600 <div class="section">
601 <h2><a name="moreinfo" id="moreinfo">Pour plus d'informations</a></h2>
602     
603
604     <p>La spécification CGI actuelle est disponible dans la <a href="http://www.ietf.org/rfc/rfc3875">Common Gateway
605     Interface RFC</a>.</p>
606
607     <p>Lorsque vous postez une question à propos d'un problème CGI que
608     vous rencontrez, que ce soit dans une liste de diffusion ou dans un
609     newsgroup, faites en sorte de fournir suffisamment d'informations
610     sur le problème rencontré, ce que vous attendiez exactement, et en
611     quoi ce qui se produit est réellement différent de ce que vous
612     attendiez, quel serveur vous utilisez, en quel langage votre
613     programme CGI a été écrit, et, si possible, son code source. Ceci
614     permettra une résolution plus aisée de votre problème.</p>
615
616     <p>Notez que les questions à propos de problèmes CGI ne doivent
617     <strong>jamais</strong> être postées dans la base de données de
618     bogues d'Apache, à moins que vous ne soyez sûr d'avoir trouvé un
619     problème dans le code source d'Apache.</p>
620   </div></div>
621 <div class="bottomlang">
622 <p><span>Langues Disponibles: </span><a href="../en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
623 <a href="../fr/howto/cgi.html" title="Français">&nbsp;fr&nbsp;</a> |
624 <a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
625 <a href="../ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
626 </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">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;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>
627 <script type="text/javascript"><!--//--><![CDATA[//><!--
628 var comments_shortname = 'httpd';
629 var comments_identifier = 'http://httpd.apache.org/docs/trunk/howto/cgi.html';
630 (function(w, d) {
631     if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
632         d.write('<div id="comments_thread"><\/div>');
633         var s = d.createElement('script');
634         s.type = 'text/javascript';
635         s.async = true;
636         s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
637         (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
638     }
639     else {
640         d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
641     }
642 })(window, document);
643 //--><!]]></script></div><div id="footer">
644 <p class="apache">Copyright 2012 The Apache Software Foundation.<br />Autorisé sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
645 <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">Glossaire</a> | <a href="../sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
646 if (typeof(prettyPrint) !== 'undefined') {
647     prettyPrint();
648 }
649 //--><!]]></script>
650 </body></html>