<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- English Revision: 151405:942939 (outdated) -->
<!-- French Translation by Vincent Deffontaines, review by alain B -->

<!--
 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="env.xml.meta">

  <title>Apache et les variables d'environnement</title>

  <summary>
    <p>Le serveur HTTP Apache permet de conserver et d'utiliser 
    certaines informations dans des variables appelées <em>variables 
    d'environnement</em>. Ces informations peuvent servir à contrôler 
    divers paramètres tels que la journalisation ou le contrôle d'accès. 
    Ces variables sont également utilisées pour communiquer avec d'autres 
    programmes, comme les scripts CGI. Ce document traite des manières 
    de manipuler et de tirer parti de ces variables.</p>

    <p>Bien qu'elles soient appelées <em>variables d'environnement</em>, 
    il ne s'agit pas de variables d'environnement contrôlées par le 
    système d'exploitation. Ces variables sont conservées, et manipulées 
    suivant des mécanismes internes à Apache. Elles sont transformées 
    en véritables variables d'environnement (au sens système) seulement 
    quand elles doivent être passées à des scripts CGI ou à des scripts 
    'Server Side Includes'. Pour manipuler l'environnement du système 
    d'exploitation sur lequel tourne un serveur Apache, il suffit 
    d'utiliser les méthodes standard fournies par l'interpréteur de 
    commandes du système d'exploitation.</p>
  </summary>

  <section id="setting">
    <title>Définir les variables d'environnement</title>
    <related>
      <modulelist>
        <module>mod_env</module>
        <module>mod_rewrite</module>
        <module>mod_setenvif</module>
        <module>mod_unique_id</module>
      </modulelist>
      <directivelist>
        <directive module="mod_setenvif">BrowserMatch</directive>
        <directive module="mod_setenvif">BrowserMatchNoCase</directive>
        <directive module="mod_env">PassEnv</directive>
        <directive module="mod_rewrite">RewriteRule</directive>
        <directive module="mod_env">SetEnv</directive>
        <directive module="mod_setenvif">SetEnvIf</directive>
        <directive module="mod_setenvif">SetEnvIfNoCase</directive>
        <directive module="mod_env">UnsetEnv</directive>
      </directivelist>
    </related>

    <section id="basic-manipulation">
        <title>Manipulations simples de l'environnement</title>

        <p>La méthode la plus simple pour définir une variable 
        d'environnement dans Apache est d'utiliser la directive 
        <directive module="mod_env" >SetEnv</directive>. Les variables 
        peuvent également être chargées depuis l'interpréteur de 
        commandes à partir duquel le serveur a été démarré, au moyen 
        de la directive <directive module="mod_env">PassEnv</directive>.</p>
        
    </section>
    <section id="conditional">
        <title>Paramétrage selon les requêtes</title>

        <p>Dans un but de souplesse, les directives que mod_setenvif 
        permet d'utiliser sont ajustables en fonction de certaines 
        caractéristiques des requêtes parvenant au serveur. Par exemple, 
        il est possible de définir une variable seulement si la requête 
        provient d'un certain type de navigateur (User-Agent), ou bien 
        si un champ Referer bien précis est trouvé. Une souplesse encore 
        plus grande est offerte par la directive 
        <directive module="mod_rewrite">RewriteRule</directive> du 
        module mod_rewrite qui accepte le paramètre <code>[E=...]
        </code> pour définir des variables d'environnement.</p>

    </section>
    <section id="unique-identifiers">
        <title>Identifiants uniques</title>

        <p>Enfin, la variable d'environnement <code>UNIQUE_ID</code> 
        est créée par mod_unique_id pour chaque requête, de manière à 
        être unique et donc représentative de chaque requête.</p>

    </section>
    <section id="standard-cgi">
        <title>Variables CGI standard</title>

        <p>En plus de toutes les variables d'environnement définies dans 
        la configuration d'Apache et celles du système d'exploitation, 
        les <a href="http://cgi-spec.golux.com/">spécifications 
        CGI</a> demandent que certaines variables d'environnement 
        contenant des informations propres à la requête soient toujours 
        passées aux scripts CGI et aux pages SSI.</p>

    </section>
    <section id="caveats">
        <title>Problèmes possibles</title>

        <ul>
          <li>Il n'est pas possible de remplacer la valeur des variables 
          CGI standard au moyen des directives qui manipulent les 
          variables d'environnement.</li>

          <li>Dans les cas où les scripts CGI sont lancés au moyen de 
          <a href="suexec.html">suexec</a>, l'environnement est nettoyé et 
          les variables sont initialisées avec des valeurs <em>sûres</em>, 
          définies lors de la compilation de <code>suexec.c</code>.</li>

          <li>Pour des raisons d'interopérabilité, les noms des variables 
          d'environnement ne peuvent être constitués que de lettres, de 
          chiffres et du caractère de soulignement '_'. De plus, le 
          premier caractère du nom ne peut pas être un chiffre. Les 
          caractères en contradiction avec ces règles sont remplacés par 
          des caractères de soulignement avant que les variables ne 
          soient transmises aux scripts CGI ou aux pages SSI.</li>
        </ul>
    </section>
  </section>
  <section id="using">
    <title>Utilisation des variables d'environnement</title>

    <related>
      <modulelist>
        <module>mod_access</module>
        <module>mod_cgi</module>
        <module>mod_ext_filter</module>
        <module>mod_headers</module>
        <module>mod_include</module>
        <module>mod_log_config</module>
        <module>mod_rewrite</module>
      </modulelist>
      <directivelist>
        <directive module="mod_access">Allow</directive>
        <directive module="mod_log_config">CustomLog</directive>
        <directive module="mod_access">Deny</directive>
        <directive module="mod_ext_filter">ExtFilterDefine</directive>
        <directive module="mod_headers">Header</directive>
        <directive module="mod_log_config">LogFormat</directive>
        <directive module="mod_rewrite">RewriteCond</directive>
        <directive module="mod_rewrite">RewriteRule</directive>
      </directivelist>
    </related>

    <section id="cgi-scripts">
        <title>Scripts CGI</title>

        <p>Une des principales utilisations des variables d'environnement 
        est l'envoi d'informations aux scripts CGI. Comme précisé ci-
        avant, l'environnement passé aux scripts CGI contient des 
        informations standard au sujet de la requête en plus de toutes 
        les variables initialisées au travers de la configuration 
        d'Apache. Pour plus de détails, consultez le 
        <a href="howto/cgi.html">tutorial CGI</a>.</p>

    </section>
    <section id="ssi-pages">
        <title>Pages SSI</title>

        <p>Les documents analysés par le serveur (documents SSI), gérés 
        par le filtre <code>INCLUDES</code> de mod_include, peuvent 
        demander l'affichage de variables d'environnement au moyen de 
        l'élément <code>echo</code>, et peuvent les utiliser pour 
        personnaliser des pages en fonctions de certaines caractéristiques 
        de la requête. Apache permet aussi l'utilisation de pages SSI avec 
        les variables d'environnement standard CGI comme discuté ci-avant. 
        Consultez le <a href="howto/ssi.html">tutorial SSI</a> 
        pour plus d'informations.</p>
	
    </section>
    <section id="access-control">
        <title>Contrôle d'accès</title>

        <p>Les droits d'accès au serveur peuvent être contrôlés au moyen 
        de variables d'environnement en utilisant les directives 
        <code>allow from env=</code> et <code>deny from env=</code>. 
        Celles ci, utilisées avec <directive module="mod_setenvif"
        >SetEnvIf</directive>, permettent un contrôle d'accès au serveur 
        très souple en fonction de caractéristiques propres au client. Par 
        exemple, il est possible d'utiliser ces directives pour refuser 
        l'accès au serveur à certains navigateurs (User-Agent).</p>

    </section>
    <section id="logging">
        <title>Journalisation sous certaines conditions</title>

        <p>Les variables d'environnement peuvent être enregistrées dans 
        le journal des accès ('access log') au moyen de l'option 
        <code>%e</code> de <directive module="mod_log_config"
        >LogFormat</directive>. De plus, la décision d'enregistrer ou 
        non certaines requêtes peut être prise en fonction des variables 
        d'environnement au moyen de la directive 
        <directive module="mod_log_config">CustomLog</directive>. Cette 
        méthode, utilisée avec la directive <directive module="mod_setenvif"
        >SetEnvIf</directive>, permet un contrôle très souple de 
        l'enregistrement des requêtes. Par exemple, il est possible de 
        ne pas garder de trace des requêtes demandant des noms de fichiers 
        se terminant par <code>gif</code>, ou de n'enregistrer que les 
        requêtes des clients situés hors du sous-réseau auquel appartient 
        le serveur.</p>

    </section>
    <section id="response-headers">
        <title>Personnaliser les en-têtes des réponses HTTP</title>

        <p>La directive <directive module="mod_headers">Header</directive> 
        peut tirer parti de l'existence ou non d'une variable 
        d'environnement afin de choisir d'inclure certains en-têtes 
        HTTP dans la réponse retournée au client. Ceci permet, par 
        exemple, d'envoyer un certain en-tête de réponse seulement si un 
        en-tête similaire a été positionné dans la requête émanant du 
        client.</p>

    </section>

    <section id="external-filter">
        <title>Activation des filtres externes</title>

        <p>Il est possible d'utiliser une variable d'environnement pour 
        activer les filtres externes (gérés par 
        <module>mod_ext_filter</module> au moyen de la directive 
        <directive module="mod_ext_filter">ExtFilterDefine</directive>) 
        grâce aux options <code>disableenv=</code> et 
        <code>enableenv=</code>.</p>
    </section>

    <section id="url-rewriting">
        <title>Réécriture d'URL</title>

        <p>La forme <code>%{ENV:...}</code> de <em>TestString</em>, dans 
        la directive <directive module="mod_rewrite"
        >RewriteCond</directive>, permet au moteur de réécriture de 
        mod_rewrite d'utiliser les variables d'environnement pour 
        contrôler les réécritures. Notez que toutes les variables 
        internes à mod_rewrite, accessibles sans le préfixe 
        <code>ENV:</code>, ne sont pas des variables d'environnement 
        d'Apache. Elles sont uniquement propres à mod_rewrite et ne 
        peuvent pas être utilisées par d'autres modules.</p>
    </section>
  </section>

  <section id="special">
    <title>Variables d'environnement spéciales</title>

        <p>Certains problèmes liés à l'interopérabilité ont conduit à la 
        mise en place de mécanismes spéciaux, qui modifient le 
        fonctionnement d'Apache selon le type des clients auxquels il 
        répond. Afin de garantir la plus grande souplesse possible, ces 
        mécanismes sont contrôlés par des variables d'environnement 
        spéciales, telles que <directive module="mod_setenvif"
        >BrowserMatch</directive>, bien qu'on puisse également utiliser 
        <directive module="mod_env">SetEnv</directive> et 
        <directive module="mod_env">PassEnv</directive> par exemple.</p>
	
    <section id="downgrade">
        <title>downgrade-1.0</title>

        <p>Ceci oblige Apache à traiter la requête comme du HTTP/1.0 même 
        si elle a été construite sur une norme plus récente.</p>

    </section>
    <section id="force-no-vary">
        <title>force-no-vary</title>

        <p>Ceci provoque l'effacement de tous les champs <code>Vary</code> 
        de l'en-tête de réponse avant qu'il ne soit envoyé au client. 
        Certains clients interprètent mal ce champ (voir 
        <a href="misc/known_client_problems.html">les problèmes avec 
        certains clients</a>), et initialiser cette variable peut 
        permettre de résoudre ce problème. Cette variable requiert 
        également l'utilisation de <strong>force-response-1.0</strong>.</p>

    </section>
    <section id="force-response">
        <title>force-response-1.0</title>

      <p>Ceci oblige Apache à n'envoyer que des réponses en HTTP/1.0 aux 
      clients réalisant une requête en HTTP/1.0. Cette fonction a été 
      implémentée au départ pour résoudre un problème avec les serveurs 
      mandataires d'AOL. Certains clients HTTP/1.0 réagissent mal quand 
      ils reçoivent une réponse en HTTP/1.1, ce qui peut poser des 
      problèmes d'interopérabilité avec eux.</p>

    </section>

    <section id="gzip-only-text-html">
        <title>gzip-only-text/html</title>

        <p>Si cette variable est positionnée avec une valeur de "1", le 
        filtre de sortie DEFLATE du module <module>mod_deflate</module> 
        se retrouve désactivé pour les documents dont le type mime n'est 
        pas <code>text/html</code>.</p>
	
    </section>

    <section id="no-gzip"><title>no-gzip</title>

        <p>Si cette variable est initialisée, le filtre <code>DEFLATE</code> 
        du module <module>mod_deflate</module> est totalement désactivé.</p>

    </section>

    <section id="nokeepalive">
        <title>nokeepalive</title>

        <p>Si cette variable est initialisée, les fonctions 
        <directive module="core">KeepAlive</directive> sont désactivées.</p>

    </section>

    <section id="prefer-language"><title>prefer-language</title>

        <p>Cette variable modifie le fonctionnement de 
        <module>mod_negotiation</module>. Si la variable contient un 
        marqueur de langue (comme <code>en</code>, <code>ja</code> ou 
        <code>x-klingon</code>), le module <module>mod_negotiation</module> 
        va tenter de fournir une réponse dans cette langue parmi les 
        variantes possibles. Si aucune de ces variantes n'existe, une 
        <a href="content-negotiation.html">négociation</a> normale aura 
        lieu.</p>

    </section>

    <section id="redirect-carefully">
        <title>redirect-carefully</title>

        <p>Cette variable rend le serveur plus attentif quand il doit 
        envoyer une redirection au client. Cette variable est 
        habituellement utilisée quand un client a un problème connu 
        pour gérer les redirections. Cette variable a été implémentée 
        pour pallier à un problème du logiciel WebFolders de Microsoft 
        qui ne sait pas gérer correctement les redirections vers les 
        répertoires via les méthodes DAV.</p>

    </section>

   <section id="suppress-error-charset">
       <title>suppress-error-charset</title>

    <p><em>Existe depuis la version 2.0.40</em></p>

    <p>Quand Apache envoie une redirection en réponse à une requête, la 
    réponse contient un message à afficher par le client, au cas où il 
    ne peut suivre automatiquement la redirection. Le fonctionnement 
    par défaut d'Apache est d'écrire ce texte avec le jeu de caractère 
    qu'il utilise, c'est à dire ISO-8859-1.</p>
    <p>Cependant, si la redirection pointe vers une page présentant un jeu 
    de caractères différent, certains navigateurs buggés utilisent le jeu 
    de caractères du texte de la redirection, au lieu de celui de la page 
    qu'ils affichaient. De ce fait, un texte en grec serait mal affiché.</p>
    <p>Si cette variable d'environnement est utilisée, Apache n'indiquera 
    pas le jeu de caractère dans le texte de la redirection, ce qui permet 
    à ces navigateurs d'afficher correctement la page de destination.</p>

   </section>

  </section>

  <section id="examples">
    <title>Exemples</title>

    <section id="misbehaving">
        <title>Modifier le fonctionnement d'un protocole pour les clients 
        qui le gèrent mal</title>

        <p>Il est conseillé de placer les lignes suivantes dans httpd.conf 
        afin de gérer des problèmes connus de certains clients.</p>
<example><pre>
#
# Les directives ci-après modifient le fonctionnement standard de HTTP.
# La première directive désactive les fonctions keepalive pour les 
# navigateurs disant s'appeler 'Netscape 2.x'
# Il existe des problèmes connus avec ces navigateurs.
# La deuxième directive gère Internet Explorer 4.0b2 de Microsoft qui
# n'implémente pas correctement HTTP/1.1 et qui ne supporte pas les 
# fonctions keepalive quand la réponse du serveur contient des codes 301 
# ou 302 (redirections)
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

#
# Les directives ci-dessous désactivent HTTP/1.1 pour les navigateurs qui 
# violent les spécifications HTTP/1.0, en ne sachant pas analyser des 
# réponses basiques en HTTP/1.1.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0</pre></example>

    </section>
    <section id="no-img-log">
        <title>Ne pas enregistrer les requêtes pour des images dans le 
        journal des accès</title>

        <p>Cet exemple montre comment ne pas enregistrer les requêtes à 
        destination d'images dans le journal des accès. Il est facile 
        de le modifier, pour limiter l'enregistrement à certains 
        répertoires, ou pour des requêtes venant de machines précises.</p>
    <example><pre>
SetEnvIf Request_URI \.gif image-request
SetEnvIf Request_URI \.jpg image-request
SetEnvIf Request_URI \.png image-request
CustomLog logs/access_log common env=!image-request</pre></example>

    </section>
    <section id="image-theft">
        <title>Empêcher le «&nbsp;vol d'images&nbsp;»</title>

        <p>Cet exemple montre comment empêcher le chargement d'images de 
        votre serveur depuis des pages qui ne sont pas hébergées sur 
        celui-ci. Cette configuration n'est pas conseillée, mais elle 
        peut être utile dans certaines circonstances. Il est supposé ici 
        que toutes les images sont stockées dans le répertoire 
        /web/images.</p>
    <example><pre>
SetEnvIf Referer "^http://www.example.com/" local_referal
# Autorise les navigateurs qui n'envoient pas de champ Referer
SetEnvIf Referer "^$" local_referal
&lt;Directory /web/images&gt;
   Order Deny,Allow
   Deny from all
   Allow from env=local_referal
&lt;/Directory&gt;</pre></example>

        <p>Pour plus d'informations sur cette technique, consultez le 
        tutorial ApacheToday «&nbsp;<a 
        href="http://apachetoday.com/news_story.php3?ltsn=2000-06-14-002-01-PS"
        >Keeping Your Images from Adorning Other Sites</a>&nbsp;».</p>
    </section>
  </section>
</manualpage>
