<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="fr"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Didacticiel du serveur HTTP Apache : Contenu dynamique bas&eacute; sur CGI - Serveur HTTP Apache Version 2.4</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<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">
<script src="../style/scripts/prettify.min.js">
</script>

<link href="../images/favicon.png" rel="shortcut icon"></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Signaler un bug</a></p>
<p class="apache">Serveur HTTP Apache Version 2.4</p>
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="https://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Recettes et tutoriels</a></div><div id="page-content"><div id="preamble"><h1>Didacticiel du serveur HTTP Apache : Contenu dynamique bas&eacute; sur CGI</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>Langues Disponibles: </span><a href="../en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../es/howto/cgi.html" hreflang="es" rel="alternate" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="../fr/howto/cgi.html" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="../ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
</div>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#intro">Introduction</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#configuring">Configurer httpd pour autoriser CGI</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#writing">Ecrire un programme CGI</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#troubleshoot">Mais &ccedil;a ne marche toujours pas !</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#behindscenes">Que se passe-t-il en coulisse</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#libraries">Biblioth&egrave;ques et modules CGI</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#moreinfo">Pour plus d'informations</a></li>
</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="intro">Introduction <a title="Lien permanent" href="#intro" class="permalink">&para;</a></h2>
    

    <table class="related"><tr><th>Modules Apparent&eacute;s</th><th>Directives Apparent&eacute;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>

    <p>CGI (Common Gateway Interface) d&eacute;finit une m&eacute;thode d'interaction
    entre un serveur web et des programmes g&eacute;n&eacute;rateurs de contenu
    externes, plus souvent appel&eacute;s programmes CGI ou scripts CGI. Il
    s'agit d'une m&eacute;thode simple pour ajouter du contenu dynamique &agrave; votre site
    web en utilisant votre langage de programmation pr&eacute;f&eacute;r&eacute;.
    Ce document est une introduction &agrave; la configuration de CGI sur votre
    serveur web HTTP Apache, et une initiation &agrave; l'&eacute;criture de programmes
    CGI.</p>
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="configuring">Configurer httpd pour autoriser CGI <a title="Lien permanent" href="#configuring" class="permalink">&para;</a></h2>
    

    <p>httpd doit &ecirc;tre configur&eacute; pour permettre l'ex&eacute;cution des
    programmes CGI, pour que vos programmes CGI puissent fonctionner
    correctement. Il existe plusieurs m&eacute;thodes pour y parvenir.</p>

    <div class="warning">Note: si httpd a &eacute;t&eacute; compil&eacute; avec le support
    des modules partag&eacute;s (DSO), vous devez vous assurer que le module CGI est
    charg&eacute; ; vous devez pour cela v&eacute;rifier que la directive <code class="directive"><a href="../mod/mod_so.html#loadmodule">LoadModule</a></code> correspondante n'a pas &eacute;t&eacute;
    comment&eacute;e dans votre <code>httpd.conf</code>. Une directive correcte
    doit ressembler &agrave; ceci :

    <pre class="prettyprint lang-config">LoadModule cgid_module modules/mod_cgid.so</pre>



     Sous Windows, ou si l'on utilise un module MPM non-thread&eacute; comme prefork,
     une directive correctement configur&eacute;e sera du style :

    <pre class="prettyprint lang-config">LoadModule cgi_module modules/mod_cgi.so</pre>
</div>


    <h3 id="scriptalias">ScriptAlias</h3>
      

      <p>La directive <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code> indique &agrave; httpd qu'un
      r&eacute;pertoire particulier est d&eacute;di&eacute; aux programmes CGI. httpd
      consid&eacute;rera que tout fichier situ&eacute; dans ce r&eacute;pertoire est un
      programme CGI, et tentera de l'ex&eacute;cuter lorsque cette ressource
      fera l'objet d'une requ&ecirc;te client.</p>

      <p>La directive <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code> se pr&eacute;sente comme suit
      :</p>

      <pre class="prettyprint lang-config">ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"</pre>


      <p>Cet exemple est tir&eacute; de votre fichier de configuration
      <code>httpd.conf</code> par d&eacute;faut, si vous avez install&eacute; httpd
      dans son r&eacute;pertoire par d&eacute;faut. La directive <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code> est similaire &agrave; la
      directive <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code>, qui
      d&eacute;finit &agrave; quel r&eacute;pertoire particulier doit correspondre un pr&eacute;fixe
      d'URL. <code class="directive">Alias</code> et
      <code class="directive">ScriptAlias</code> sont g&eacute;n&eacute;ralement utilis&eacute;s pour
      acc&eacute;der &agrave; des r&eacute;pertoires situ&eacute;s en dehors du r&eacute;pertoire d&eacute;fini
      par la directive <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code>. La diff&eacute;rence entre
      <code class="directive">Alias</code> et <code class="directive">ScriptAlias</code>
      r&eacute;side dans le fait que <code class="directive">ScriptAlias</code> indique
      en plus que tout ce qui se trouve sous le pr&eacute;fixe d'URL doit &ecirc;tre
      consid&eacute;r&eacute; comme un programme CGI. Ainsi, l'exemple ci-dessus
      indique &agrave; httpd que toute requ&ecirc;te pour une ressource commen&ccedil;ant
      par <code>/cgi-bin/</code> doit &ecirc;tre servie depuis le r&eacute;pertoire
      <code>/usr/local/apache2/cgi-bin/</code>, et doit &ecirc;tre trait&eacute;e en
      tant que programme CGI.</p>

      <p>Par exemple, si une requ&ecirc;te pour l'URL
      <code>http://www.example.com/cgi-bin/test.pl</code> est
      effectu&eacute;e, httpd tentera d'ex&eacute;cuter le fichier
      <code>/usr/local/apache2/cgi-bin/test.pl</code> et en renverra la
      sortie. Bien entendu, le fichier doit exister, &ecirc;tre ex&eacute;cutable, et
      retourner sa sortie d'une mani&egrave;re particuli&egrave;re, sinon httpd
      renverra un message d'erreur.</p>
    

    <h3 id="nonscriptalias">CGI en dehors des r&eacute;pertoires ScripAlias</h3>
      

      <p>Pour des raisons de s&eacute;curit&eacute;, la localisation des programmes
      CGI est souvent restreinte aux
      r&eacute;pertoires d&eacute;finis par <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>. De cette mani&egrave;re, les administrateurs
      peuvent contr&ocirc;ler pr&eacute;cis&eacute;ment qui est autoris&eacute; &agrave; utiliser les
      programmes CGI. Cependant, si les pr&eacute;cautions ad&eacute;quates quant &agrave;
      la s&eacute;curit&eacute; sont prises, il n'y a aucune raison pour que les
      programmes CGI ne puissent pas &ecirc;tre ex&eacute;cut&eacute;s depuis d'autres
      r&eacute;pertoires. Par exemple, vous pouvez autoriser les utilisateurs &agrave;
      enregistrer des contenus web dans leurs r&eacute;pertoires home &agrave; l'aide
      de la directive <code class="directive"><a href="../mod/mod_userdir.html#userdir">UserDir</a></code>. S'ils veulent mettre en
      oeuvre leurs propres programmes CGI, mais n'ont pas l'autorisation
      d'acc&egrave;s au r&eacute;pertoire <code>cgi-bin</code> principal, ils devront
      &ecirc;tre en mesure d'ex&eacute;cuter ces programmes depuis un autre
      r&eacute;pertoire.</p>

      <p>L'autorisation d'ex&eacute;cution des programmes CGI dans un
      r&eacute;pertoire arbitraire se fait en deux &eacute;tapes. En premier lieu, le
      gestionnaire <code>cgi-script</code> doit &ecirc;tre activ&eacute; &agrave; l'aide
      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,
      <code>ExecCGI</code> doit &ecirc;tre sp&eacute;cifi&eacute; dans la directive <code class="directive"><a href="../mod/core.html#options">Options</a></code>.</p>
    

    <h3 id="options">Utilisation d'options explicites pour permettre l'ex&eacute;cution
      des programmes CGI</h3>
      

      <p>Vous pouvez utiliser de mani&egrave;re explicite la directive
      <code class="directive"><a href="../mod/core.html#options">Options</a></code> dans le fichier de
      configuration de votre serveur principal, pour indiquer que
      l'ex&eacute;cution des programmes CGI est permise depuis un r&eacute;pertoire
      particulier :</p>

      <pre class="prettyprint lang-config">&lt;Directory "/usr/local/apache2/htdocs/somedir"&gt;
    Options +ExecCGI
&lt;/Directory&gt;</pre>


      <p>La directive ci-dessus indique &agrave; httpd qu'il doit permettre
      l'ex&eacute;cution des fichiers CGI. Vous devez aussi indiquer au serveur
      quels fichiers sont des fichiers CGI. La directive <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> suivante indique au
      serveur qu'il doit traiter tous les fichiers poss&eacute;dant une
      extension <code>cgi</code> ou <code>pl</code> en tant que
      programmes CGI :</p>

      <pre class="prettyprint lang-config">AddHandler cgi-script .cgi .pl</pre>

    

    <h3 id="htaccess">Fichiers .htaccess</h3>
      

      <p>Le <a href="htaccess.html"><code>tutoriel
      .htaccess</code></a> montre comment activer les programmes
      CGI si vous n'avez pas acc&egrave;s au
      fichier <code>httpd.conf</code>.</p>
    

    <h3 id="userdir">R&eacute;pertoires utilisateurs</h3>
      

      <p>Pour permettre l'ex&eacute;cution en tant que programme CGI de tout
      fichier poss&eacute;dant l'extension <code>.cgi</code> et situ&eacute; dans un
      r&eacute;pertoire utilisateur, vous pouvez utiliser la configuration
      suivante :</p>

      <pre class="prettyprint lang-config">&lt;Directory "/home/*/public_html"&gt;
    Options +ExecCGI
    AddHandler cgi-script .cgi
&lt;/Directory&gt;</pre>


      <p>Pour indiquer un sous-r&eacute;pertoire <code>cgi-bin</code> d'un
      r&eacute;pertoire utilisateur o&ugrave; tout fichier sera trait&eacute; en tant que
      programme CGI, vous pouvez utiliser ceci :</p>

      <pre class="prettyprint lang-config">&lt;Directory "/home/*/public_html/cgi-bin"&gt;
    Options ExecCGI
    SetHandler cgi-script
&lt;/Directory&gt;</pre>


    

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="writing">Ecrire un programme CGI <a title="Lien permanent" href="#writing" class="permalink">&para;</a></h2>
    

    <p>Il y a deux diff&eacute;rences principales entre la programmation
    "standard" et la programmation CGI.</p>

    <p>En premier lieu, toute sortie de votre programme CGI doit &ecirc;tre
    pr&eacute;c&eacute;d&eacute;e d'un en-t&ecirc;te <a class="glossarylink" href="../glossary.html#mime-type" title="voir glossaire">MIME-type</a>. Il s'agit d'un
    en-t&ecirc;te HTTP qui indique au client quel type de contenu il re&ccedil;oit.
    La plupart du temps, il se pr&eacute;sente comme suit :</p>

    <div class="example"><p><code>
      Content-type: text/html
    </code></p></div>

    <p>En second lieu, votre sortie doit &ecirc;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 &ecirc;tre
    amen&eacute; &agrave; &eacute;crire un programme CGI qui renvoie une image gif, ou un
    autre type de contenu non-HTML.</p>

    <p>A part ces deux diff&eacute;rences, un programme CGI ressemblera &agrave; tout
    autre programme que vous pourriez &ecirc;tre amen&eacute; &agrave; &eacute;crire.</p>

    <h3 id="firstcgi">Votre premier programme CGI</h3>
      

      <p>L'exemple suivant est un exemple de programme CGI qui permet
      d'afficher une ligne de caract&egrave;res dans votre navigateur. Ecrivez
      ce qui suit, enregistrez le dans un fichier nomm&eacute;
      <code>premier.pl</code>, et placez le dans votre r&eacute;pertoire
      <code>cgi-bin</code>.</p>

      <pre class="prettyprint lang-perl">#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";</pre>


      <p>M&ecirc;me si Perl ne vous est pas familier, vous devriez &ecirc;tre
      capable de comprendre le fonctionnement de ce programme. La
      premi&egrave;re ligne indique &agrave; httpd (ou &agrave; toute interface &agrave; partir de
      laquelle le programme s'ex&eacute;cute) que ce programme peut &ecirc;tre
      ex&eacute;cut&eacute; en fournissant son fichier &agrave; l'interpr&eacute;teur
      <code>/usr/bin/perl</code>. La seconde ligne affiche la
      d&eacute;claration du type de contenu consid&eacute;r&eacute;, suivie de deux paires
      "Retour chariot - Nouvelle ligne". Ceci a pour effet d'ins&eacute;rer une
      ligne vide apr&egrave;s l'en-t&ecirc;te pour marquer la fin des en-t&ecirc;tes HTTP,
      et le d&eacute;but du corps du document. La troisi&egrave;me ligne affiche la
      cha&icirc;ne de caract&egrave;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>

      <div class="example"><p><code>
        http://www.example.com/cgi-bin/premier.pl
      </code></p></div>

      <p>ou toute autre URL correspondant &agrave; votre programme CGI, Vous
      verrez la ligne <code>Bonjour tout le monde . . .</code>
      s'afficher dans la fen&ecirc;tre de votre navigateur. Ce n'est pas
      extraordinaire, mais si vous y &ecirc;tes parvenu, vous avez de bonnes
      chances d'y parvenir pour tout autre programme plus
      sophistiqu&eacute;.</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="troubleshoot">Mais &ccedil;a ne marche toujours pas ! <a title="Lien permanent" href="#troubleshoot" class="permalink">&para;</a></h2>
    

    <p>Vous devriez voir au moins une des quatre sorties suivantes dans
    votre navigateur lorsque vous essayez d'acc&eacute;der &agrave; 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&eacute;e correctement par
      le navigateur, assurez-vous d'avoir d&eacute;fini
      <code>Content-Type</code> de mani&egrave;re appropri&eacute;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&eacute; httpd de mani&egrave;re
      &agrave; ce qu'il puisse traiter votre programme CGI. Relisez la section
      sur la <a href="#configuring">configuration de httpd</a>, et
      essayez de trouver votre erreur.</dd>

      <dt>Un message commen&ccedil;ant par "Forbidden"</dt>
      <dd>Ce type de message est r&eacute;v&eacute;lateur d'un probl&egrave;me de
      droits. Consultez le <a href="#errorlogs">journal des erreurs
      de httpd</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
      de httpd</a>, vous y trouverez probablement des messages du type
      "Premature end of script headers" (Fin pr&eacute;matur&eacute;e des en-t&ecirc;tes de
      script), &eacute;ventuellement accompagn&eacute;s d'un message d'erreur g&eacute;n&eacute;r&eacute;
      par votre programme CGI. Dans ce cas, il va vous falloir lire
      chacune des sections ci-dessous pour d&eacute;terminer ce qui emp&ecirc;che
      votre programme CGI de g&eacute;n&eacute;rer les en-t&ecirc;tes appropri&eacute;s.</dd>
    </dl>

    <h3 id="permissions">Droits des fichiers</h3>
      

      <p>Souvenez-vous que le serveur ne s'ex&eacute;cute pas sous votre nom.
      En d'autres termes, lorsque le serveur a d&eacute;marr&eacute;, il s'ex&eacute;cute
      avec les droits d'un utilisateur non privil&eacute;gi&eacute; - en g&eacute;n&eacute;ral
      <code>nobody</code>, ou <code>www</code> - et en cons&eacute;quence, il
      aura besoin de droits suppl&eacute;mentaires pour pouvoir ex&eacute;cuter des
      fichiers dont vous &ecirc;tes le propri&eacute;taire. En g&eacute;n&eacute;ral, pour qu'un
      fichier ait des droits suffisants pour &ecirc;tre ex&eacute;cutable par
      <code>nobody</code>, il suffit de lui attribuer des droits
      d'ex&eacute;cution pour tout le monde :</p>

      <div class="example"><p><code>
        chmod a+x premier.pl
      </code></p></div>

      <p>En outre, si votre programme doit pouvoir acc&eacute;der en lecture
      et/ou &eacute;criture &agrave; d'autres fichiers, ces derniers devront avoir les
      droits appropri&eacute;s.</p>

    

    <h3 id="pathinformation">Chemin des ex&eacute;cutables (PATH) et variables
      d'environnement</h3>
      

      <p>Lorsque vous lancez un programme depuis la ligne de commande,
      certaines informations sont pass&eacute;es au shell sans que vous vous en
      doutiez. Par exemple, la variable <code>PATH</code> indique au
      shell o&ugrave; il doit rechercher les ex&eacute;cutables auxquels vous faites
      r&eacute;f&eacute;rence.</p>

      <p>Lorsqu'un programme s'ex&eacute;cute depuis le serveur web en tant que
      programme CGI, sa variable <code>PATH</code> n'aura peut-&ecirc;tre pas
      la m&ecirc;me valeur. Tout programme que vous invoquez dans votre
      programme CGI ( comme par exemple <code>sendmail</code>) devra
      &ecirc;tre sp&eacute;cifi&eacute; par son chemin complet, de fa&ccedil;on &agrave; ce que le shell
      puisse le trouver lorsqu'il tentera d'ex&eacute;cuter votre programme
      CGI.</p>

      <p>Un exemple typique de sp&eacute;cification de programme est le chemin
      vers l'interpr&eacute;teur de script (souvent <code>perl</code>) que l'on
      trouve &agrave; la premi&egrave;re ligne de votre programme CGI et qui va
      ressembler &agrave; ceci :</p>

      <pre class="prettyprint lang-perl">#!/usr/bin/perl</pre>


      <p>Assurez-vous qu'il s'agit bien du chemin correct vers
      l'interpr&eacute;teur.</p>

      <div class="warning">
      Lors de l'&eacute;dition de scripts CGI sous Windows, il se peut que des
      caract&egrave;res de fin de ligne soient ajout&eacute;s au chemin de
      l'interpr&eacute;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" &agrave; cause des
      caract&egrave;res de fin de ligne non reconnus car consid&eacute;r&eacute;s comme
      faisant partie du nom de fichier de l'interpr&eacute;teur.
      </div>

      

    <h3 id="missingenv">Variables d'environnement manquantes</h3>
      

      <p>Si votre programme CGI d&eacute;pend de <a href="#env">variables
      d'environnement</a> non standards, vous devrez vous assurez que
      ces variables lui sont bien transmises par httpd.</p>

      <p>Lorsque des en-t&ecirc;tes HTTP ne sont pas transmis &agrave; l'environnement,
      assurez-vous qu'ils sont bien format&eacute;s selon la <a href="https://www.rfc-editor.org/rfc/rfc2616">RFC 2616</a>, section
      4.2 : les noms d'en-t&ecirc;tes doivent commencer par une lettre, elle-m&ecirc;me
      suivie de lettres, chiffres ou traits d'union. Tout en-t&ecirc;te dont le nom
      viole cette r&egrave;gle sera ignor&eacute;.</p>

    

    <h3 id="syntaxerrors">Erreurs inh&eacute;rentes au programme</h3>
      

      <p>La plupart des &eacute;checs dans l'ex&eacute;cution d'un programme CGI
      proviennent du programme lui-m&ecirc;me. Ceci est particuli&egrave;rement vrai
      lorsque ce satan&eacute; programme CGI se bloque, alors que vous avez
      appris &agrave; ne plus commettre les deux erreurs pr&eacute;c&eacute;dentes. La
      premi&egrave;re chose &agrave; faire est de vous assurer que votre programme
      s'ex&eacute;cute depuis la ligne de commande, avant de le tester &agrave; partir
      du serveur web. Par exemple, essayez :</p>

      <div class="example"><p><code>
      cd /usr/local/apache2/cgi-bin<br>
      ./premier.pl
      </code></p></div>

      <p>(N'invoquez pas l'interpr&eacute;teur <code>perl</code>. Le shell et
      httpd doivent &ecirc;tre capable de le d&eacute;terminer &agrave; partir de <a href="#pathinformation">l'information sur le chemin</a> situ&eacute;e sur
      la premi&egrave;re ligne du script.)</p>

      <p>La premi&egrave;re chose que vous devriez voir affich&eacute;e par votre
      programme est un ensemble d'en-t&ecirc;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, httpd renverra l'erreur
      <code>Premature end of script headers</code> si vous tentez
      d'ex&eacute;cuter le programme depuis le serveur. Voir <a href="#writing">Ecriture d'un programme CGI</a> ci-dessus pour
      plus de d&eacute;tails.</p>
    

    <h3 id="errorlogs">Journalisation des erreurs</h3>
      

      <p>Les journaux d'erreurs sont vos amis. Toute anomalie de
      fonctionnement est consign&eacute;e dans le journal des erreurs et c'est
      ici que vous devez regarder en premier en cas de probl&egrave;me. Si
      l'h&eacute;bergeur de votre site ne vous donne pas acc&egrave;s au journal des
      erreurs, vous avez tout int&eacute;r&ecirc;t &agrave; vous tourner vers quelqu'un
      d'autre. Apprenez &agrave; d&eacute;chiffrer les journaux d'erreurs, et vous
      vous apercevrez que la plupart des probl&egrave;mes seront rapidement
      identifi&eacute;s . . . et r&eacute;solus.</p>
    

    <h3 id="suexec">Suexec</h3>
      

      <p>Le programme <a href="../suexec.html">suexec</a> permet
      d'ex&eacute;cuter les programmes CGI avec des droits diff&eacute;rents selon le
      serveur virtuel ou le r&eacute;pertoire utilisateur dans lequel ils
      se situent. Suexec effectue une v&eacute;rification des droits tr&egrave;s
      stricte, et toute anomalie d&eacute;tect&eacute;e au cours de cette v&eacute;rification
      entra&icirc;nera un echec d'ex&eacute;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&eacute; par
      <code>SUEXEC_BIN</code>. Si au d&eacute;marrage d'httpd, ce dernier
      trouve un ex&eacute;cutable <code class="program"><a href="../programs/suexec.html">suexec</a></code> dans ce chemin,
      suexec sera activ&eacute;.</p>

      <p>Si vous ne ma&icirc;trisez pas le fonctionnement de suexec, il vous
      est d&eacute;conseill&eacute; de l'utiliser. Pour d&eacute;sactiver suexec, supprimer
      simplement (ou renommez) l'ex&eacute;cutable <code class="program"><a href="../programs/suexec.html">suexec</a></code>
      point&eacute; par <code>SUEXEC_BIN</code> et red&eacute;marrez le serveur. Si
      apr&egrave;s une lecture de <a href="../suexec.html">suexec</a>, vous
      d&eacute;cidez quand-m&ecirc;me de l'utiliser, tapez la commande <code>suexec
      -V</code> pour voir o&ugrave; se situe le journal de suexec, et utilisez
      ce dernier pour d&eacute;terminer quelles r&egrave;gles vous violez
      &eacute;ventuellement.</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="behindscenes">Que se passe-t-il en coulisse <a title="Lien permanent" href="#behindscenes" class="permalink">&para;</a></h2>
    

    <p>Lorsque vos comp&eacute;tences en programmation CGI seront plus
    pouss&eacute;es, il s'av&eacute;rera int&eacute;ressant pour vous de mieux comprendre ce
    qui se passe en coulisse, et en particulier la mani&egrave;re dont le
    navigateur et le serveur dialoguent entre eux. En effet, bien qu'il
    soit tout &agrave; fait louable d'&eacute;crire un programme qui affiche "Bonjour
    tout le monde . . .", cela ne sert pas &agrave; grand chose.</p>

    <h3 id="env">Variables d'environnement</h3>
      

      <p>Les variables d'environnement sont des valeurs qui gravitent
      autour de vous lorsque vous utilisez votre ordinateur. Elles sont
      tr&egrave;s utiles, &agrave; l'instar de votre chemin par d&eacute;faut (o&ugrave; votre
      ordinateur va rechercher le fichier physique correspondant &agrave; la
      commande que vous avez tap&eacute;e), votre nom d'utilisateur, le type de
      votre terminal, etc... Pour obtenir une liste compl&egrave;te des
      variables d'environnement standards que vous utilisez tous les
      jours, tapez <code>env</code> dans votre interpr&eacute;teur
      de commandes.</p>

      <p>Au cours de la transaction CGI, le serveur et le navigateur
      d&eacute;finissent aussi des variables d'environnement, de fa&ccedil;on &agrave; ce
      qu'ils puissent communiquer entre eux. Ces variables d&eacute;finissent
      entre autre le type de navigateur (Netscape, IE, Lynx), le type de
      serveur (httpd, IIS, WebSite), le nom du programme CGI en cours
      d'ex&eacute;cution, etc...</p>

      <p>Ces variables sont &agrave; la disposition du programmeur CGI, et elles
      constituent 50% de la communication client-serveur. La liste compl&egrave;te des
      variables requises se trouve dans la <a href="https://www.rfc-editor.org/rfc/rfc3875">RFC 3875</a> (Common Gateway
      Interface).</p>

      <p>Ce programme CGI basique en Perl permet d'afficher toutes les
      variables d'environnement qui sont &eacute;chang&eacute;es. Deux programmes
      similaires sont fournis avec la distribution de httpd et situ&eacute;s
      dans le r&eacute;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, httpd vous propose de nombreuses
      m&eacute;thodes pour <a href="../env.html">ajouter vos propres
      variables d'environnement</a> aux variables de base fournies par
      d&eacute;faut.</p>

      <pre class="prettyprint lang-perl">#!/usr/bin/perl
use strict;
use warnings;

print "Content-type: text/html\n\n";
foreach my $key (keys %ENV) {
    print "$key --&gt; $ENV{$key}&lt;br&gt;";
}</pre>

    

    <h3 id="stdin">STDIN et STDOUT</h3>
      

      <p>L'entr&eacute;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 &agrave; un fichier fourni
      au programme &agrave; des fins de traitement, et <code>STDOUT</code> &agrave; la
      console ou &agrave; l'&eacute;cran.</p>

      <p>Lorsque vous transmettez un formulaire web &agrave; un programme CGI
      par la m&eacute;thode <code>POST</code>, les donn&eacute;es de ce formulaire
      sont transcrites dans un format sp&eacute;cial et transmises &agrave; 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&eacute;cial" est tr&egrave;s simple. Un nom de champ et sa
      valeur sont reli&eacute;s entre eux par un signe "&eacute;gal" (=), et chacune
      de ces paires nom champ/valeur est s&eacute;par&eacute;e de la suivante par un
      "et" commercial (&amp;). Les caract&egrave;res
      sp&eacute;ciaux comme les espaces, les "et" commerciaux, et les signes
      "&eacute;gal" sont convertis en leur &eacute;quivalent hexad&eacute;cimal pour &eacute;viter
      qu'ils ne g&acirc;chent le travail. La cha&icirc;ne contenant les donn&eacute;es doit
      ressembler &agrave; ceci :</p>

      <div class="example"><p><code>
        name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
      </code></p></div>

      <p>Vous verrez aussi parfois une cha&icirc;ne de ce type accol&eacute;e &agrave; une
      URL. Dans ce cas, le serveur enregistre cette cha&icirc;ne dans la
      variable d'environnement appel&eacute;e <code>QUERY_STRING</code>. On a
      alors affaire &agrave; une requ&ecirc;te de type <code>GET</code>. Votre
      formulaire HTML indique laquelle des m&eacute;thodes <code>GET</code> ou
      <code>POST</code> est utilis&eacute;e pour transmettre les donn&eacute;es, en
      d&eacute;finissant l'attribut <code>METHOD</code> au niveau de la balise
      <code>FORM</code>.</p>

      <p>Votre programme est ensuite charg&eacute; d'extraire les informations
      utiles de cette cha&icirc;ne. Heureusement, des biblioth&egrave;ques et des
      modules sont &agrave; votre disposition pour vous aider &agrave; traiter ces
      donn&eacute;es, et &agrave; g&eacute;rer les diff&eacute;rents aspects de votre programme
      CGI.</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="libraries">Biblioth&egrave;ques et modules CGI <a title="Lien permanent" href="#libraries" class="permalink">&para;</a></h2>
    

    <p>Pour &eacute;crire un programme CGI, il vous est conseill&eacute; d'utiliser
    une biblioth&egrave;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&eacute;l&eacute;rer le d&eacute;veloppement.</p>

    <p>Si vous &eacute;crivez des programmes CGI en Perl, des modules sont &agrave;
    votre disposition &agrave; <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&eacute;mente les
    fonctionnalit&eacute;s strictement n&eacute;cessaires, mais suffisantes pour
    la majorit&eacute; des programmes.</p>

    <p>Si vous &eacute;crivez des programmes CGI en C, vous disposez de nombreuses
    options. L'une d'elles est la biblioth&egrave;que <code>CGIC</code> de <a href="https://web.mit.edu/wwwdev/www/cgic.html">https://web.mit.edu/wwwdev/www/cgic.html</a>.</p>
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="moreinfo">Pour plus d'informations <a title="Lien permanent" href="#moreinfo" class="permalink">&para;</a></h2>
    

    <p>La sp&eacute;cification CGI actuelle est disponible dans la <a href="https://www.rfc-editor.org/rfc/rfc3875">RFC 3875</a>
    (Common Gateway Interface).</p>

    <p>Lorsque vous postez une question &agrave; propos d'un probl&egrave;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&egrave;me rencontr&eacute;, ce que vous attendiez exactement, et en
    quoi ce qui se produit est r&eacute;ellement diff&eacute;rent de ce que vous
    attendiez, quel serveur vous utilisez, en quel langage votre
    programme CGI a &eacute;t&eacute; &eacute;crit, et, si possible, son code source. Ceci
    permettra une r&eacute;solution plus ais&eacute;e de votre probl&egrave;me.</p>

    <p>Notez que les questions &agrave; propos de probl&egrave;mes CGI ne doivent
    <strong>jamais</strong> &ecirc;tre post&eacute;es dans la base de donn&eacute;es de
    bogues de httpd, &agrave; moins que vous ne soyez s&ucirc;r d'avoir trouv&eacute; un
    probl&egrave;me dans le code source de httpd.</p>
  </div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../es/howto/cgi.html" hreflang="es" rel="alternate" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="../fr/howto/cgi.html" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="../ko/howto/cgi.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br>Autoris&eacute; sous <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Signaler un bug</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
    langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
    document.body.appendChild(qv);
    var qvBtn = document.createElement('button');
    qvBtn.className = 'qv-toggle';
    qvBtn.setAttribute('aria-label', 'Toggle page navigation');
    qvBtn.innerHTML = '&#9776;';
    document.body.appendChild(qvBtn);
    qvBtn.addEventListener('click', function() {
        var isOpen = qv.classList.toggle('open');
        if (isOpen) {
            qv.style.top = window.scrollY + 10 + 'px';
        }
    });
    window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>