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