| <?xml version="1.0" encoding="UTF-8" ?> |
| <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd"> |
| <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?> |
| <!-- English Revision: 1773247 --> |
| <!-- French translation : Lucien GENTIS --> |
| <!-- Reviewed by : Vincent Deffontaines --> |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <manualpage metafile="cgi.xml.meta"> |
| <parentdocument href="./">Recettes et tutoriels</parentdocument> |
| |
| <title>Tutoriel Apache : Contenu dynamique basé sur CGI</title> |
| |
| <section id="intro"> |
| <title>Introduction</title> |
| |
| <related> |
| <modulelist> |
| <module>mod_alias</module> |
| <module>mod_cgi</module> |
| <module>mod_cgid</module> |
| </modulelist> |
| |
| <directivelist> |
| <directive module="mod_mime">AddHandler</directive> |
| <directive module="core">Options</directive> |
| <directive module="mod_alias">ScriptAlias</directive> |
| </directivelist> |
| </related> |
| |
| <p>CGI (Common Gateway Interface) définit une méthode d'interaction |
| entre un serveur web et des programmes générateurs de contenu |
| externes, plus souvent appelés programmes CGI ou scripts CGI. |
| Il s'agit d'une méthode simple pour ajouter du contenu dynamique à votre site |
| web en utilisant votre langage de programmation préféré. |
| Ce document est une introduction à la configuration de CGI sur votre |
| serveur web Apache, et une initiation à l'écriture de programmes |
| CGI.</p> |
| </section> |
| |
| <section id="configuring"> |
| <title>Configurer Apache pour autoriser CGI</title> |
| |
| <p>Apache doit être configuré pour permettre l'exécution des |
| programmes CGI, pour que vos programmes CGI puissent fonctionner |
| correctement. Il existe plusieurs méthodes pour y parvenir.</p> |
| |
| <note type="warning">Note: si Apache a été compilé avec le support |
| des modules partagés (DSO), vous devez vous assurer que le module CGI est |
| chargé ; vous devez pour cela vérifier que la directive <directive |
| module="mod_so">LoadModule</directive> correspondante n'a pas été |
| commentée dans votre <code>httpd.conf</code>. Une directive correcte |
| doit ressembler à ceci : |
| |
| <highlight language="config"> |
| LoadModule cgid_module modules/mod_cgid.so |
| </highlight> |
| |
| |
| Sous Windows, ou si l'on utilise un module MPM non-threadé comme prefork, |
| une directive correctement configurée sera du style : |
| |
| <highlight language="config"> |
| LoadModule cgi_module modules/mod_cgi.so |
| </highlight></note> |
| |
| |
| <section id="scriptalias"> |
| <title>ScriptAlias</title> |
| |
| <p>La directive <directive |
| module="mod_alias">ScriptAlias</directive> indique à Apache qu'un |
| répertoire particulier est dédié aux programmes CGI. Apache |
| considérera que tout fichier situé dans ce répertoire est un |
| programme CGI, et tentera de l'exécuter lorsque cette ressource |
| fera l'objet d'une requête client.</p> |
| |
| <p>La directive <directive |
| module="mod_alias">ScriptAlias</directive> se présente comme suit |
| :</p> |
| |
| <highlight language="config"> |
| ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/" |
| </highlight> |
| |
| <p>Cet exemple est tiré de votre fichier de configuration |
| <code>httpd.conf</code> par défaut, si vous avez installé Apache |
| dans son répertoire par défaut. La directive <directive |
| module="mod_alias">ScriptAlias</directive> est similaire à la |
| directive <directive module="mod_alias">Alias</directive>, qui |
| définit à quel répertoire particulier doit correspondre un préfixe |
| d'URL. <directive>Alias</directive> et |
| <directive>ScriptAlias</directive> sont généralement utilisés pour |
| accéder à des répertoires situés en dehors du répertoire défini |
| par la directive <directive |
| module="core">DocumentRoot</directive>. La différence entre |
| <directive>Alias</directive> et <directive>ScriptAlias</directive> |
| réside dans le fait que <directive>ScriptAlias</directive> indique |
| en plus que tout ce qui se trouve sous le préfixe d'URL doit être |
| considéré comme un programme CGI. Ainsi, l'exemple ci-dessus |
| indique à Apache que toute requête pour une ressource commençant |
| par <code>/cgi-bin/</code> doit être servie depuis le répertoire |
| <code>/usr/local/apache2/cgi-bin/</code>, et doit être traitée en |
| tant que programme CGI.</p> |
| |
| <p>Par exemple, si une requête pour l'URL |
| <code>http://www.example.com/cgi-bin/test.pl</code> est |
| effectuée, Apache tentera d'exécuter le fichier |
| <code>/usr/local/apache2/cgi-bin/test.pl</code> et en renverra la |
| sortie. Bien entendu, le fichier doit exister, être exécutable, et |
| retourner sa sortie d'une manière particulière, sinon Apache |
| renverra un message d'erreur.</p> |
| </section> |
| |
| <section id="nonscriptalias"> |
| <title>CGI en dehors des répertoires ScripAlias</title> |
| |
| <p>Pour des raisons de sécurité, la localisation des programmes |
| CGI est souvent restreinte aux |
| répertoires définis par <directive module="mod_alias" |
| >ScriptAlias</directive>. De cette manière, les administrateurs |
| peuvent contrôler précisément qui est autorisé à utiliser les |
| programmes CGI. Cependant, si les précautions adéquates quant à |
| la sécurité sont prises, il n'y a aucune raison pour que les |
| programmes CGI ne puissent pas être exécutés depuis d'autres |
| répertoires. Par exemple, vous pouvez autoriser les utilisateurs à |
| enregistrer des contenus web dans leurs répertoires home à l'aide |
| de la directive <directive |
| module="mod_userdir">UserDir</directive>. S'ils veulent mettre en |
| oeuvre leurs propres programmes CGI, mais n'ont pas l'autorisation |
| d'accès au répertoire <code>cgi-bin</code> principal, ils devront |
| être en mesure d'exécuter ces programmes depuis un autre |
| répertoire.</p> |
| |
| <p>L'autorisation d'exécution des programmes CGI dans un |
| répertoire arbitraire se fait en deux étapes. En premier lieu, le |
| gestionnaire <code>cgi-script</code> doit être activé à l'aide |
| d'une directive <directive |
| module="mod_mime">AddHandler</directive> ou <directive |
| module="core">SetHandler</directive>. En second lieu, |
| <code>ExecCGI</code> doit être spécifié dans la directive <directive |
| module="core">Options</directive>.</p> |
| </section> |
| |
| <section id="options"> |
| <title>Utilisation d'options explicites pour permettre l'exécution |
| des programmes CGI</title> |
| |
| <p>Vous pouvez utiliser de manière explicite la directive |
| <directive module="core">Options</directive> dans le fichier de |
| configuration de votre serveur principal, pour indiquer que |
| l'exécution des programmes CGI est permise depuis un répertoire |
| particulier :</p> |
| |
| <highlight language="config"> |
| <Directory "/usr/local/apache2/htdocs/somedir"> |
| Options +ExecCGI |
| </Directory> |
| </highlight> |
| |
| <p>La directive ci-dessus indique à Apache qu'il doit permettre |
| l'exécution des fichiers CGI. Vous devez aussi indiquer au serveur |
| quels fichiers sont des fichiers CGI. La directive <directive |
| module="mod_mime">AddHandler</directive> suivante indique au |
| serveur qu'il doit traiter tous les fichiers possédant une |
| extension <code>cgi</code> ou <code>pl</code> en tant que |
| programmes CGI :</p> |
| |
| <highlight language="config"> |
| AddHandler cgi-script .cgi .pl |
| </highlight> |
| </section> |
| |
| <section id="htaccess"> |
| <title>Fichiers .htaccess</title> |
| |
| <p>Le <a href="htaccess.html"><code>tutoriel |
| .htaccess</code></a> montre comment activer les programmes |
| CGI si vous n'avez pas accès au |
| fichier <code>httpd.conf</code>.</p> |
| </section> |
| |
| <section id="userdir"> |
| <title>Répertoires utilisateurs</title> |
| |
| <p>Pour permettre l'exécution en tant que programme CGI de tout |
| fichier possédant l'extension <code>.cgi</code> et situé dans un |
| répertoire utilisateur, vous pouvez utiliser la configuration |
| suivante :</p> |
| |
| <highlight language="config"> |
| <Directory "/home/*/public_html"> |
| Options +ExecCGI |
| AddHandler cgi-script .cgi |
| </Directory> |
| </highlight> |
| |
| <p>Pour indiquer un sous-répertoire <code>cgi-bin</code> d'un |
| répertoire utilisateur où tout fichier sera traité en tant que |
| programme CGI, vous pouvez utiliser ceci :</p> |
| |
| <highlight language="config"> |
| <Directory "/home/*/public_html/cgi-bin"> |
| Options ExecCGI |
| SetHandler cgi-script |
| </Directory> |
| </highlight> |
| |
| </section> |
| |
| </section> |
| |
| <section id="writing"> |
| <title>Ecrire un programme CGI</title> |
| |
| <p>Il y a deux différences principales entre la programmation |
| "standard" et la programmation CGI.</p> |
| |
| <p>En premier lieu, toute sortie de votre programme CGI doit être |
| précédée d'un en-tête <glossary>MIME-type</glossary>. Il s'agit d'un |
| en-tête HTTP qui indique au client quel type de contenu il reçoit. |
| La plupart du temps, il se présente comme suit :</p> |
| |
| <example> |
| Content-type: text/html |
| </example> |
| |
| <p>En second lieu, votre sortie doit être en HTML, ou tout autre |
| format qu'un navigateur est en mesure d'afficher. La plupart du |
| temps, il s'agira de HTML, mais occasionnellement, vous pouvez être |
| amené à écrire un programme CGI qui renvoie une image gif, ou un |
| autre type de contenu non-HTML.</p> |
| |
| <p>A part ces deux différences, un programme CGI ressemblera à tout |
| autre programme que vous pourriez être amené à écrire.</p> |
| |
| <section id="firstcgi"> |
| <title>Votre premier programme CGI</title> |
| |
| <p>L'exemple suivant est un exemple de programme CGI qui permet |
| d'afficher une ligne de caractères dans votre navigateur. Ecrivez |
| ce qui suit, enregistrez le dans un fichier nommé |
| <code>premier.pl</code>, et placez le dans votre répertoire |
| <code>cgi-bin</code>.</p> |
| |
| <highlight language="perl"> |
| #!/usr/bin/perl |
| print "Content-type: text/html\n\n"; |
| print "Hello, World."; |
| </highlight> |
| |
| <p>Même si Perl ne vous est pas familier, vous devriez être |
| capable de comprendre le fonctionnement de ce programme. La |
| première ligne indique à Apache (ou à toute interface à partir de |
| laquelle le programme s'exécute) que ce programme peut être |
| exécuté en fournissant son fichier à l'interpréteur |
| <code>/usr/bin/perl</code>. La seconde ligne affiche la |
| déclaration du type de contenu considéré, suivie de deux paires |
| "Retour chariot - Nouvelle ligne". Ceci a pour effet d'insérer une |
| ligne vide après l'en-tête pour marquer la fin des en-têtes HTTP, |
| et le début du corps du document. La troisième ligne affiche la |
| chaîne de caractères "Bonjour tout le monde . . .". Et c'est tout |
| ce dont vous avez besoin.</p> |
| |
| <p>Si vous ouvrez votre navigateur favori et lui indiquez |
| l'adresse</p> |
| |
| <example> |
| http://www.example.com/cgi-bin/premier.pl |
| </example> |
| |
| <p>ou toute autre URL correspondant à votre programme CGI, Vous |
| verrez la ligne <code>Bonjour tout le monde . . .</code> |
| s'afficher dans la fenêtre de votre navigateur. Ce n'est pas |
| extraordinaire, mais si vous y êtes parvenu, vous avez de bonnes |
| chances d'y parvenir pour tout autre programme plus |
| sophistiqué.</p> |
| </section> |
| </section> |
| |
| <section id="troubleshoot"> |
| <title>Mais ça ne marche toujours pas !</title> |
| |
| <p>Vous devriez voir au moins une des quatre sorties suivantes dans |
| votre navigateur lorsque vous essayez d'accéder à votre programme |
| CGI depuis le web :</p> |
| |
| <dl> |
| <dt>Le flux de sortie de votre programme CGI</dt> |
| <dd>Impeccable ! Cela signifie que tout fonctionne correctement. |
| Si la sortie est correcte mais n'est pas traitée correctement par |
| le navigateur, assurez-vous d'avoir défini |
| <code>Content-Type</code> de manière appropriée dans votre |
| programme CGI.</dd> |
| |
| <dt>Le code source de votre programme CGI ou un message "POST |
| Method Not Allowed"</dt> |
| <dd>Cela signifie que vous n'avez pas configuré Apache de manière |
| à ce qu'il puisse traiter votre programme CGI. Relisez la section |
| sur la <a href="#configuring">configuration d'Apache</a>, et |
| essayez de trouver votre erreur.</dd> |
| |
| <dt>Un message commençant par "Forbidden"</dt> |
| <dd>Ce type de message est révélateur d'un problème de |
| droits. Consultez le <a href="#errorlogs">journal des erreurs |
| d'Apache</a> et la section ci-dessous sur les <a |
| href="#permissions">droits des fichiers</a>.</dd> |
| |
| <dt>Un message contenant "Internal Server Error"</dt> |
| <dd>Si vous consultez le <a href="#errorlogs">journal des erreurs |
| d'Apache</a>, vous y trouverez probablement des messages du type |
| "Premature end of script headers" (Fin prématurée des en-têtes de |
| script), éventuellement accompagnés d'un message d'erreur généré |
| par votre programme CGI. Dans ce cas, il va vous falloir lire |
| chacune des sections ci-dessous pour déterminer ce qui empêche |
| votre programme CGI de générer les en-têtes appropriés.</dd> |
| </dl> |
| |
| <section id="permissions"> |
| <title>Droits des fichiers</title> |
| |
| <p>Souvenez-vous que le serveur ne s'exécute pas sous votre nom. |
| En d'autres termes, lorsque le serveur a démarré, il s'exécute |
| avec les droits d'un utilisateur non privilégié - en général |
| <code>nobody</code>, ou <code>www</code> - et en conséquence, il |
| aura besoin de droits supplémentaires pour pouvoir exécuter des |
| fichiers dont vous êtes le propriétaire. En général, pour qu'un |
| fichier ait des droits suffisants pour être exécutable par |
| <code>nobody</code>, il suffit de lui attribuer des droits |
| d'exécution pour tout le monde :</p> |
| |
| <example> |
| chmod a+x premier.pl |
| </example> |
| |
| <p>En outre, si votre programme doit pouvoir accéder en lecture |
| et/ou écriture à d'autres fichiers, ces derniers devront avoir les |
| droits appropriés.</p> |
| |
| </section> |
| |
| <section id="pathinformation"> |
| <title>Chemin des exécutables (PATH) et variables |
| d'environnement</title> |
| |
| <p>Lorsque vous lancez un programme depuis la ligne de commande, |
| certaines informations sont passées au shell sans que vous vous en |
| doutiez. Par exemple, la variable <code>PATH</code> indique au |
| shell où il doit rechercher les exécutables auxquels vous faites |
| référence.</p> |
| |
| <p>Lorsqu'un programme s'exécute depuis le serveur web en tant que |
| programme CGI, sa variable <code>PATH</code> n'aura peut-être pas |
| la même valeur. Tout programme que vous invoquez dans votre |
| programme CGI ( comme par exemple <code>sendmail</code>) devra |
| être spécifié par son chemin complet, de façon à ce que le shell |
| puisse le trouver lorsqu'il tentera d'exécuter votre programme |
| CGI.</p> |
| |
| <p>Un exemple typique de spécification de programme est le chemin |
| vers l'interpréteur de script (souvent <code>perl</code>) que l'on |
| trouve à la première ligne de votre programme CGI et qui va |
| ressembler à ceci :</p> |
| |
| <highlight language="perl"> |
| #!/usr/bin/perl |
| </highlight> |
| |
| <p>Assurez-vous qu'il s'agit bien du chemin correct vers |
| l'interpréteur.</p> |
| |
| <note type="warning"> |
| Lors de l'édition de scripts CGI sous Windows, il se peut que des |
| caractères de fin de ligne soient ajoutés au chemin de |
| l'interpréteur. Assurez-vous donc que les fichiers sont bien |
| transmis au serveur en mode ASCII. Dans le cas contraire, l'OS |
| pourra envoyer des avertissements "Command not found" à cause des |
| caractères de fin de ligne non reconnus car considérés comme |
| faisant partie du nom de fichier de l'interpréteur. |
| </note> |
| |
| </section> |
| |
| <section id="missingenv"> |
| <title>Variables d'environnement manquantes</title> |
| |
| <p>Si votre programme CGI dépend de <a href="#env">variables |
| d'environnement</a> non standards, vous devrez vous assurez que |
| ces variables lui sont bien transmises par Apache.</p> |
| |
| <p>Lorsque des en-têtes HTTP ne sont pas transmis à |
| l'environnement, assurez-vous qu'ils sont bien formatés selon la |
| <a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a>, section |
| 4.2 : les noms d'en-têtes doivent commencer par une lettre, |
| elle-même suivie de lettres, chiffres ou traits d'union. Tout |
| en-tête dont le nom viole cette règle sera ignoré.</p> |
| |
| </section> |
| |
| <section id="syntaxerrors"> |
| <title>Erreurs inhérentes au programme</title> |
| |
| <p>La plupart des échecs dans l'exécution d'un programme CGI |
| proviennent du programme lui-même. Ceci est particulièrement vrai |
| lorsque ce satané programme CGI se bloque, alors que vous avez |
| appris à ne plus commettre les deux erreurs précédentes. La |
| première chose à faire est de vous assurer que votre programme |
| s'exécute depuis la ligne de commande, avant de le tester à partir |
| du serveur web. Par exemple, essayez :</p> |
| |
| <example> |
| cd /usr/local/apache2/cgi-bin<br/> |
| ./premier.pl |
| </example> |
| |
| <p>(N'invoquez pas l'interpréteur <code>perl</code>. Le shell et |
| Apache doivent être capable de le déterminer à partir de <a |
| href="#pathinformation">l'information sur le chemin</a> située sur |
| la première ligne du script.)</p> |
| |
| <p>La première chose que vous devriez voir affichée par votre |
| programme est un ensemble d'en-têtes HTTP, comprenant entre autres |
| le <code>Content-Type</code>, et suivi d'une ligne vide. Si vous |
| voyez quoi que ce soit d'autre, Apache renverra l'erreur |
| <code>Premature end of script headers</code> si vous tentez |
| d'exécuter le programme depuis le serveur. Voir <a |
| href="#writing">Ecriture d'un programme CGI</a> ci-dessus pour |
| plus de détails.</p> |
| </section> |
| |
| <section id="errorlogs"> |
| <title>Journalisation des erreurs</title> |
| |
| <p>Les journaux d'erreurs sont vos amis. Toute anomalie de |
| fonctionnement est consignée dans le journal des erreurs et c'est |
| ici que vous devez regarder en premier en cas de problème. Si |
| l'hébergeur de votre site ne vous donne pas accès au journal des |
| erreurs, vous avez tout intérêt à vous tourner vers quelqu'un |
| d'autre. Apprenez à déchiffrer les journaux d'erreurs, et vous |
| vous apercevrez que la plupart des problèmes seront rapidement |
| identifiés . . . et résolus.</p> |
| </section> |
| |
| <section id="suexec"> |
| <title>Suexec</title> |
| |
| <p>Le programme <a href="../suexec.html">suexec</a> permet |
| d'exécuter les programmes CGI avec des droits différents selon le |
| serveur virtuel ou le répertoire utilisateur dans lequel ils |
| se situent. Suexec effectue une vérification des droits très |
| stricte, et toute anomalie détectée au cours de cette vérification |
| entraînera un echec d'exécution de votre programme CGI avec |
| affichage de l'erreur <code>Premature end of script |
| headers</code>.</p> |
| |
| <p>Pour savoir si vous pouvez utiliser suexec, tapez la commande |
| <code>apachectl -V</code>, et regardez le chemin indiqué par |
| <code>SUEXEC_BIN</code>. Si au démarrage d'Apache, ce dernier |
| trouve un exécutable <program>suexec</program> dans ce chemin, |
| suexec sera activé.</p> |
| |
| <p>Si vous ne maîtrisez pas le fonctionnement de suexec, il vous |
| est déconseillé de l'utiliser. Pour désactiver suexec, supprimer |
| simplement (ou renommez) l'exécutable <program>suexec</program> |
| pointé par <code>SUEXEC_BIN</code> et redémarrez le serveur. Si |
| après une lecture de <a href="../suexec.html">suexec</a>, vous |
| décidez quand-même de l'utiliser, tapez la commande <code>suexec |
| -V</code> pour voir où se situe le journal de suexec, et utilisez |
| ce dernier pour déterminer quelles règles vous violez |
| éventuellement.</p> |
| </section> |
| </section> |
| |
| <section id="behindscenes"> |
| <title>Que se passe-t-il en coulisse</title> |
| |
| <p>Lorsque vos compétences en programmation CGI seront plus |
| poussées, il s'avérera intéressant pour vous de mieux comprendre ce |
| qui se passe en coulisse, et en particulier la manière dont le |
| navigateur et le serveur dialoguent entre eux. En effet, bien qu'il |
| soit tout à fait louable d'écrire un programme qui affiche "Bonjour |
| tout le monde . . .", cela ne sert pas à grand chose.</p> |
| |
| <section id="env"> |
| <title>Variables d'environnement</title> |
| |
| <p>Les variables d'environnement sont des valeurs qui gravitent |
| autour de vous lorsque vous utilisez votre ordinateur. Elles sont |
| très utiles, à l'instar de votre chemin par défaut (où votre |
| ordinateur va rechercher le fichier physique correspondant à la |
| commande que vous avez tapée), votre nom d'utilisateur, le type de |
| votre terminal, etc... Pour obtenir une liste complète des |
| variables d'environnement standards que vous utilisez tous les |
| jours, tapez <code>env</code> dans votre interpréteur |
| de commandes.</p> |
| |
| <p>Au cours de la transaction CGI, le serveur et le navigateur |
| définissent aussi des variables d'environnement, de façon à ce |
| qu'ils puissent communiquer entre eux. Ces variables définissent |
| entre autre le type de navigateur (Netscape, IE, Lynx), le type de |
| serveur (Apache, IIS, WebSite), le nom du programme CGI en cours |
| d'exécution, etc...</p> |
| |
| <p>Ces variables sont à la disposition du programmeur CGI, et |
| elles constituent 50% de la communication client-serveur. La liste |
| complète des variables requises se trouve à |
| <a href="http://www.ietf.org/rfc/rfc3875">Common Gateway |
| Interface RFC</a>.</p> |
| |
| <p>Ce programme CGI basique en Perl permet d'afficher toutes les |
| variables d'environnement qui sont échangées. Deux programmes |
| similaires sont fournis avec la distribution d'Apache et situés |
| dans le répertoire <code>cgi-bin</code>. |
| Notez que certaines variables sont |
| obligatoires, alors que d'autres sont optionnelles, si bien que |
| vous verrez s'afficher certaines variables qui ne font pas partie |
| de la liste officielle. De plus, Apache vous propose de nombreuses |
| méthodes pour <a href="../env.html">ajouter vos propres |
| variables d'environnement</a> aux variables de base fournies par |
| défaut.</p> |
| |
| <highlight language="perl"> |
| #!/usr/bin/perl |
| use strict; |
| use warnings; |
| |
| print "Content-type: text/html\n\n"; |
| foreach my $key (keys %ENV) { |
| print "$key --> $ENV{$key}<br>"; |
| } |
| </highlight> |
| </section> |
| |
| <section id="stdin"> |
| <title>STDIN et STDOUT</title> |
| |
| <p>L'entrée standard (<code>STDIN</code>) et la sortie standard |
| (<code>STDOUT</code>) constituent d'autres voies de communication |
| entre le client et le serveur. Dans un contexte normal, |
| <code>STDIN</code> correspond au clavier, ou à un fichier fourni |
| au programme à des fins de traitement, et <code>STDOUT</code> à la |
| console ou à l'écran.</p> |
| |
| <p>Lorsque vous transmettez un formulaire web à un programme CGI |
| par la méthode <code>POST</code>, les données de ce formulaire |
| sont transcrites dans un format spécial et transmises à votre |
| programme CGI via <code>STDIN</code>. Le programme peut alors les |
| traiter comme si elles provenaient du clavier ou d'un |
| fichier.</p> |
| |
| <p>Ce "format spécial" est très simple. Un nom de champ et sa |
| valeur sont reliés entre eux par un signe "égal" (=), et chacune |
| de ces paires nom champ/valeur est séparée de la suivante par un |
| "et" commercial (&). Les caractères |
| spéciaux comme les espaces, les "et" commerciaux, et les signes |
| "égal" sont convertis en leur équivalent hexadécimal pour éviter |
| qu'ils ne gâchent le travail. La chaîne contenant les données doit |
| ressembler à ceci :</p> |
| |
| <example> |
| name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey |
| </example> |
| |
| <p>Vous verrez aussi parfois une chaîne de ce type accolée à une |
| URL. Dans ce cas, le serveur enregistre cette chaîne dans la |
| variable d'environnement appelée <code>QUERY_STRING</code>. On a |
| alors affaire à une requête de type <code>GET</code>. Votre |
| formulaire HTML indique laquelle des méthodes <code>GET</code> ou |
| <code>POST</code> est utilisée pour transmettre les données, en |
| définissant l'attribut <code>METHOD</code> au niveau de la balise |
| <code>FORM</code>.</p> |
| |
| <p>Votre programme est ensuite chargé d'extraire les informations |
| utiles de cette chaîne. Heureusement, des bibliothèques et des |
| modules sont à votre disposition pour vous aider à traiter ces |
| données, et à gérer les différents aspects de votre programme |
| CGI.</p> |
| </section> |
| </section> |
| <!-- reprendre ici --> |
| <section id="libraries"> |
| <title>Bibliothèques et modules CGI</title> |
| |
| <p>Pour écrire un programme CGI, il vous est conseillé d'utiliser |
| une bibliothèque de code, ou un module, qui effectueront une grande |
| partie du travail de base pour vous. Ceci vous permettra de diminuer |
| le nombre d'erreurs et d'accélérer le développement.</p> |
| |
| <p>Si vous écrivez des programmes CGI en Perl, des modules sont à |
| votre disposition à <a href="http://www.cpan.org/">CPAN</a>. A ce |
| sujet, le module le plus populaire est <code>CGI.pm</code>. Vous |
| pouvez aussi essayer <code>CGI::Lite</code>, qui implémente les |
| fonctionnalités strictement nécessaires, mais suffisantes pour |
| la majorité des programmes.</p> |
| |
| <p>Si vous écrivez des programmes CGI en C, vous disposez de |
| nombreuses options. L'une d'elles est la bibliothèque |
| <code>CGIC</code> de <a href="http://www.boutell.com/cgic/" |
| >http://www.boutell.com/cgic/</a>.</p> |
| </section> |
| |
| <section id="moreinfo"> |
| <title>Pour plus d'informations</title> |
| |
| <p>La spécification CGI actuelle est disponible dans la <a |
| href="http://www.ietf.org/rfc/rfc3875">Common Gateway |
| Interface RFC</a>.</p> |
| |
| <p>Lorsque vous postez une question à propos d'un problème CGI que |
| vous rencontrez, que ce soit dans une liste de diffusion ou dans un |
| newsgroup, faites en sorte de fournir suffisamment d'informations |
| sur le problème rencontré, ce que vous attendiez exactement, et en |
| quoi ce qui se produit est réellement différent de ce que vous |
| attendiez, quel serveur vous utilisez, en quel langage votre |
| programme CGI a été écrit, et, si possible, son code source. Ceci |
| permettra une résolution plus aisée de votre problème.</p> |
| |
| <p>Notez que les questions à propos de problèmes CGI ne doivent |
| <strong>jamais</strong> être postées dans la base de données de |
| bogues d'Apache, à moins que vous ne soyez sûr d'avoir trouvé un |
| problème dans le code source d'Apache.</p> |
| </section> |
| </manualpage> |
| |