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