1 <?xml version="1.0" encoding="ISO-8859-1" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
4 <!-- English Revision: 1300910:1330883 (outdated) -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
9 Licensed to the Apache Software Foundation (ASF) under one or more
10 contributor license agreements. See the NOTICE file distributed with
11 this work for additional information regarding copyright ownership.
12 The ASF licenses this file to You under the Apache License, Version 2.0
13 (the "License"); you may not use this file except in compliance with
14 the License. You may obtain a copy of the License at
16 http://www.apache.org/licenses/LICENSE-2.0
18 Unless required by applicable law or agreed to in writing, software
19 distributed under the License is distributed on an "AS IS" BASIS,
20 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 See the License for the specific language governing permissions and
22 limitations under the License.
25 <manualpage metafile="env.xml.meta">
27 <title>Apache et les variables d'environnement</title>
30 <p>Deux types de variables d'environnement affectent le serveur
33 <p>Le premier type correspond aux variables d'environnement
34 contrôlées par le système d'exploitation sous-jacent et définies
35 avant le démarrage du serveur. Leurs valeurs peuvent être utilisées
36 directement dans les fichiers de configuration, et peuvent
37 éventuellement être transmises aux scripts CGI et SSI via la
38 directive PassEnv.</p>
40 <p>Le second type correspond aux variables nommées appelées aussi
41 <em>variables d'environnement</em> dans lesquelles le serveur HTTP
42 Apache stocke des informations via un mécanisme spécial. Ces
43 informations peuvent servir à contrôler diverses opérations comme
44 l'enregistrement des traces ou le contrôle d'accès. On utilise aussi ces
45 variables dans le mécanisme de communication avec les programmes externes
46 comme les scripts CGI. Ce document présente différentes méthodes pour
47 manipuler et utiliser ces variables.</p>
49 <p>Bien que ces variables soient référencées comme <em>variables
50 d'environnement</em>, il ne faut pas les confondre avec les variables
51 d'environnement contrôlées par le système d'exploitation sous-jacent.
52 En fait, ces variables sont stockées et manipulées dans une structure
53 interne à Apache. Elles ne deviennent de véritables variables
54 d'environnement du système d'exploitation que lorsqu'elles sont mises à la
55 disposition de scripts CGI et de scripts inclus côté serveur (SSI). Si vous
56 souhaitez manipuler l'environnement du système d'exploitation sous lequel
57 le serveur s'exécute, vous devez utiliser les mécanismes standards de
58 manipulation de l'environnement fournis par l'interpréteur de commandes
59 (shell) de votre système d'exploitation.</p>
62 <section id="setting">
63 <title>Définition des variables d'environnement</title>
66 <module>mod_cache</module>
67 <module>mod_env</module>
68 <module>mod_rewrite</module>
69 <module>mod_setenvif</module>
70 <module>mod_unique_id</module>
73 <directive module="mod_setenvif">BrowserMatch</directive>
74 <directive module="mod_setenvif">BrowserMatchNoCase</directive>
75 <directive module="mod_env">PassEnv</directive>
76 <directive module="mod_rewrite">RewriteRule</directive>
77 <directive module="mod_env">SetEnv</directive>
78 <directive module="mod_setenvif">SetEnvIf</directive>
79 <directive module="mod_setenvif">SetEnvIfNoCase</directive>
80 <directive module="mod_env">UnsetEnv</directive>
84 <section id="basic-manipulation">
85 <title>Manipulations de base de l'environnement</title>
87 <p>La méthode la plus élémentaire pour définir une variable
88 d'environnement au niveau d'Apache consiste à utiliser la directive
89 inconditionnelle <directive module="mod_env"
90 >SetEnv</directive>. Les variables peuvent aussi être transmises depuis
91 l'environnement du shell à partir duquel le serveur a été démarré en
92 utilisant la directive
93 <directive module="mod_env">PassEnv</directive>.</p>
96 <section id="conditional">
97 <title>Définitions conditionnelles en fonction des requêtes</title>
99 <p>Pour plus de souplesse, les directives fournies par le module
100 <module>mod_setenvif</module> permettent de définir les
101 variables d'environnement en tenant compte des caractéristiques
102 de chaque requête. Par exemple, une
103 variable pourrait n'être définie que lorsqu'un navigateur spécifique
104 (User-Agent) a généré la requête, ou seulement quand un en-tête
105 Referer particulier est présent. La directive
106 <directive module="mod_rewrite">RewriteRule</directive> du module
107 <module>mod_rewrite</module> qui utilise l'option
108 <code>[E=...]</code> pour définir
109 les variables d'environnement apporte encore plus de souplesse.</p>
112 <section id="unique-identifiers">
113 <title>Identifiants uniques</title>
115 <p>Finalement, le module <module>mod_unique_id</module> définit la variable
116 d'environnement <code>UNIQUE_ID</code> pour chaque requête à une valeur
117 qui est garantie unique parmi "toutes" les requêtes sous des
118 conditions très spécifiques.</p>
121 <section id="standard-cgi">
122 <title>Variables CGI standards</title>
124 <p>En plus de l'ensemble des variables d'environnement internes à la
125 configuration d'Apache et de celles transmises depuis le shell,
126 les scripts CGI et les pages SSI
127 se voient affectés un ensemble de variables
128 d'environnement contenant des méta-informations à propos de la requête
129 comme préconisé dans la
130 <a href="http://www.ietf.org/rfc/rfc3875">spécification
131 sur les CGIs</a>.</p>
134 <section id="caveats">
135 <title>Quelques mises en garde</title>
138 <li>Les directives de manipulation de l'environnement ne permettent
139 pas de supplanter ou modifier les variables CGI standards.</li>
141 <li>Lorsqu'on utilise <program>suexec</program> pour exécuter des
142 scripts CGI, l'environnement est nettoyé et réduit à un ensemble de
143 variables <em>sûres</em> avant l'exécution du script. La liste des
144 variables <em>sûres</em> est définie à la compilation dans
145 <code>suexec.c</code>.</li>
147 <li>Pour des raisons de portabilité, les noms des variables
148 d'environnement ne peuvent contenir que des lettres, des chiffres, et
149 le caractère "sousligné". En outre, le premier caractère ne doit pas
150 être un chiffre. Les caractères qui ne satisfont pas à ces conditions
151 seront remplacés par un caractère "sousligné" quand ils seront
152 transmis aux scripts CGI et aux pages SSI.</li>
154 <li>Les contenus d'en-têtes HTTP transmis aux scripts de type
155 CGI ou autre via des variables d'environnement constituent un
156 cas particulier (voir plus loin). Leur nom est converti en
157 majuscules et seuls les tirets sont remplacés par des
158 caractères '_' ("souligné") ; si le format du nom de l'en-tête
159 n'est pas valide, celui-ci est ignoré. Voir <a
160 href="#fixheader">plus loin</a> pour une solution de
161 contournement du problème.</li>
163 <li>La directive <directive
164 module="mod_env">SetEnv</directive> s'exécute assez tard au
165 cours du traitement de la requête, ce qui signifie que des
166 directives telles que <directive
167 module="mod_setenvif">SetEnvIf</directive> et <directive
168 module="mod_rewrite">RewriteCond</directive> ne verront pas
169 les variables qu'elle aura définies.</li>
174 <title>Utilisation des variables d'environnement</title>
178 <module>mod_authz_host</module>
179 <module>mod_cgi</module>
180 <module>mod_ext_filter</module>
181 <module>mod_headers</module>
182 <module>mod_include</module>
183 <module>mod_log_config</module>
184 <module>mod_rewrite</module>
187 <directive module="mod_access_compat">Allow</directive>
188 <directive module="mod_log_config">CustomLog</directive>
189 <directive module="mod_access_compat">Deny</directive>
190 <directive module="mod_ext_filter">ExtFilterDefine</directive>
191 <directive module="mod_headers">Header</directive>
192 <directive module="mod_log_config">LogFormat</directive>
193 <directive module="mod_rewrite">RewriteCond</directive>
194 <directive module="mod_rewrite">RewriteRule</directive>
198 <section id="cgi-scripts">
199 <title>Scripts CGI</title>
201 <p>La communication d'informations aux scripts CGI constitue une des
202 principales utilisations des variables d'environnement. Comme indiqué
203 plus haut, l'environnement transmis aux scripts CGI comprend des
204 méta-informations standards à propos de la requête, en plus des
205 variables définies dans la configuration d'Apache. Pour plus de
206 détails, se référer au
207 <a href="howto/cgi.html">tutoriel CGI</a>.</p>
210 <section id="ssi-pages">
211 <title>Pages SSI</title>
213 <p>Les documents inclus côté serveur (SSI) traités par le filtre
214 <code>INCLUDES</code> du module <module>mod_include</module>,
216 variables d'environnement à l'aide de l'élément <code>echo</code>,
217 et peuvent utiliser des variables d'environnement dans les éléments
218 de contrôle de flux pour rendre certaines parties d'une page
219 conditionnelles en fonction des caractéristiques de la requête.
220 Apache fournit aussi les variables d'environnement CGI standards
222 comme indiqué plus haut. Pour plus de détails, se référer au
223 <a href="howto/ssi.html">tutoriel SSI</a>.</p>
226 <section id="access-control">
227 <title>Contrôle d'accès</title>
229 <p>L'accès au serveur peut être contrôlé en fonction de la valeur de
230 variables d'environnement à l'aide des directives
231 <code>allow from env=</code> et <code>deny from env=</code>.
232 En association avec la directive
233 <directive module="mod_setenvif">SetEnvIf</directive>, ceci confère une
234 grande souplesse au contrôle d'accès au serveur en fonction des
235 caractéristiques du client. Par exemple, vous pouvez utiliser ces
236 directives pour interdire l'accès depuis un navigateur particulier
241 <section id="logging">
242 <title>Enregistrement conditionnel des traces</title>
244 <p>Les variables d'environnement peuvent être enregistrées dans le
245 fichier de log des accès à l'aide de l'option <code>%e</code> de la
246 directive <directive module="mod_log_config">LogFormat</directive>.
247 En outre, la décision de tracer ou non les requêtes peut être prise
248 en fonction de l'état de variables d'environnement en utilisant la
249 forme conditionnelle de la directive
250 <directive module="mod_log_config">CustomLog</directive>. En
251 association avec la directive <directive module="mod_setenvif"
252 >SetEnvIf</directive>, ceci confère une grande souplesse au contrôle
253 du traçage des requêtes. Par exemple, vous pouvez choisir de ne pas
254 tracer les requêtes pour des noms de fichiers se terminant par
255 <code>gif</code>, ou encore de ne tracer que les requêtes des clients
256 n'appartenant pas à votre sous-réseau.</p>
259 <section id="response-headers">
260 <title>En-têtes de réponse conditionnels</title>
262 <p>La directive <directive module="mod_headers">Header</directive>
263 peut se baser sur la présence ou l'absence d'une variable
264 d'environnement pour décider si un certain en-tête HTTP sera placé
265 dans la réponse au client. Ceci permet, par exemple, de n'envoyer un
266 certain en-tête de réponse que si un en-tête correspondant est présent
267 dans la requête du client.</p>
271 <section id="external-filter">
272 <title>Activation de filtres externes</title>
274 <p>Les filtres externes configurés par le module
275 <module>mod_ext_filter</module> à l'aide de la directive <directive
276 module="mod_ext_filter">ExtFilterDefine</directive> peuvent être
277 activés de manière conditionnelle en fonction d'une variable
278 d'environnement à l'aide des options
279 <code>disableenv=</code> et <code>enableenv=</code>.</p>
282 <section id="url-rewriting">
283 <title>Réécriture d'URL</title>
285 <p>La forme <code>%{ENV:<em>variable</em>}</code> de
286 <em>TestString</em> dans la
287 directive <directive module="mod_rewrite">RewriteCond</directive>
288 permet au moteur de réécriture du module
289 <module>mod_rewrite</module> de prendre des
290 décisions conditionnées par des variables d'environnement.
291 Notez que les variables accessibles dans
292 <module>mod_rewrite</module> sans le préfixe
293 <code>ENV:</code> ne sont pas de véritables variables
294 d'environnement. Ce sont plutôt des variables spécifiques à
295 <module>mod_rewrite</module>
296 qui ne sont pas accessibles pour les autres modules.</p>
300 <section id="special">
301 <title>Variables d'environnement à usage spécial</title>
303 <p>Des problèmes d'interopérabilité ont conduit à l'introduction de
304 mécanismes permettant de modifier le comportement d'Apache lorsqu'il
305 dialogue avec certains clients. Afin de rendre ces mécanismes aussi
306 souples que possible, ils sont invoqués en définissant des variables
307 d'environnement, en général à l'aide de la directive
308 <directive module="mod_setenvif">BrowserMatch</directive>, bien que les
309 directives <directive module="mod_env">SetEnv</directive> et
310 <directive module="mod_env">PassEnv</directive> puissent aussi être
311 utilisées, par exemple.</p>
313 <section id="downgrade">
314 <title>downgrade-1.0</title>
316 <p>Ceci force le traitement d'une requête comme une requête HTTP/1.0
317 même si elle a été rédigée dans un langage plus récent.</p>
320 <section id="force-gzip">
321 <title>force-gzip</title>
322 <p>Si le filtre <code>DEFLATE</code> est activé, cette variable
323 d'environnement ignorera les réglages accept-encoding de votre
324 navigateur et enverra une sortie compressée inconditionnellement.</p>
326 <section id="force-no-vary">
327 <title>force-no-vary</title>
329 <p>Cette variable entraîne la suppression de tout champ
330 <code>Vary</code> des en-têtes de la réponse avant que cette dernière
331 soit renvoyée au client. Certains clients n'interprètent pas ce champ
332 correctement, et la définition de cette variable permet de contourner
333 ce problème, mais implique aussi la définition de
334 <strong>force-response-1.0</strong>.</p>
337 <section id="force-response">
338 <title>force-response-1.0</title>
340 <p>Cette variable force une réponse en langage HTTP/1.0 aux clients
341 qui envoient des requêtes dans le même langage. Elle fut implémentée à
342 l'origine suite à des problèmes avec les mandataires d'AOL. Certains
343 clients en langage HTTP/1.0 ne réagissent pas correctement face à une
344 réponse en langage HTTP/1.1, et cette variable peut être utilisée pour
345 assurer l'interopérabilité avec eux.</p>
349 <section id="gzip-only-text-html">
350 <title>gzip-only-text/html</title>
352 <p>Positionnée à "1", cette variable désactive le filtre en sortie
353 <code>DEFLATE</code> fourni par le module <module>mod_deflate</module> pour les
354 types de contenu autres que <code>text/html</code>. Si vous préférez
355 utiliser des fichiers compressés statiquement,
356 <module>mod_negotiation</module> évalue aussi la variable (non
357 seulement pour gzip, mais aussi pour tous les encodages autres que
361 <section id="no-gzip"><title>no-gzip</title>
363 <p>Quand cette variable est définie, le filtre <code>DEFLATE</code> du
364 module <module>mod_deflate</module> est désactivé, et
365 <module>mod_negotiation</module> refusera de délivrer des ressources
370 <section id="no-cache"><title>no-cache</title>
371 <p><em>Disponible dans les versions 2.2.12 et ultérieures d'Apache</em></p>
373 <p>Lorsque cette variable est définie,
374 <module>mod_cache</module> ne sauvegardera pas de réponse
375 susceptible d'être mise en cache. Cette variable d'environnement
376 n'a aucune incidence sur le fait qu'une réponse déjà enregistrée
377 dans la cache soit utilisée ou non pour la requête courante.</p>
381 <section id="nokeepalive">
382 <title>nokeepalive</title>
384 <p>Quand cette variable est définie, la directive
385 <directive module="core">KeepAlive</directive> est désactivée.</p>
389 <section id="prefer-language"><title>prefer-language</title>
391 <p>Cette variable modifie le comportement du module
392 <module>mod_negotiation</module>. Si elle contient un symbole de
393 langage (tel que <code>en</code>, <code>ja</code>
394 ou <code>x-klingon</code>), <module>mod_negotiation</module> essaie de
395 délivrer une variante dans ce langage. S'il n'existe pas de telle
396 variante, le processus normal de
397 <a href="content-negotiation.html">négociation</a> s'applique.</p>
401 <section id="redirect-carefully">
402 <title>redirect-carefully</title>
404 <p>Cette variable force le serveur à être plus prudent lors de l'envoi
405 d'une redirection au client. Elle est en général utilisée quand un
406 client présente un problème connu avec les redirections. Elle fut
407 implémentée à l'origine suite a un problème rencontré avec le logiciel
408 WebFolders de Microsoft qui ne gère pas correctement les redirections
409 vers des ressources de type répertoire via des méthodes DAV.</p>
413 <section id="suppress-error-charset">
414 <title>suppress-error-charset</title>
416 <p><em>Disponible dans les versions postérieures à 2.0.54</em></p>
418 <p>Quand Apache génère une redirection en réponse à une requête client,
419 la réponse inclut un texte destiné à être affiché au cas où le client ne
420 suivrait pas, ou ne pourrait pas suivre automatiquement la redirection.
421 Habituellement, Apache marque ce texte en accord avec le jeu de caractères
422 qu'il utilise, à savoir ISO-8859-1.</p>
423 <p> Cependant, si la redirection fait référence à une page qui utilise un
424 jeu de caractères différent, certaines versions de navigateurs obsolètes
425 essaieront d'utiliser le jeu de caractères du texte de la redirection
426 plutôt que celui de la page réelle.
427 Ceci peut entraîner, par exemple, un rendu incorrect du Grec.</p>
428 <p>Si cette variable d'environnement est définie, Apache omettra le jeu de
429 caractères pour le texte de la redirection, et les navigateurs obsolètes
430 précités utiliseront correctement celui de la page de destination.</p>
432 <note type="warning">
433 <title>Note concernant la sécurité</title>
435 <p>L'envoi de pages d'erreur sans spécifier un jeu de caractères peut
436 conduire à des attaques de type "cross-site-scripting" pour les
437 navigateurs qui ne respectent pas la spécification HTTP/1.1 (MSIE) et
438 tentent de déduire le jeu de caractères à partir du contenu. De tels
439 navigateurs peuvent être facilement trompés et utiliser le jeu de
440 caractères UTF-7 ; les contenus des données en entrée de type UTF-7
441 (comme les URI de requête) ne seront alors plus protégés par les
442 mécanismes d'échappement usuels conçus pour prévenir les attaques
443 de type "cross-site-scripting".</p>
448 <section id="proxy"><title>force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked,
449 proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled</title>
451 <p>Ces directives modifient le comportement protocolaire du module
452 <module>mod_proxy</module>. Voir la documentation sur
453 <module>mod_proxy</module> et <module>mod_proxy_http</module> pour plus de détails.</p>
458 <section id="examples">
459 <title>Exemples</title>
461 <section id="fixheader">
462 <title>Transmission du contenu d'en-têtes non valides aux scripts
465 <p>Avec la version 2.4, Apache est plus strict avec la conversion
466 des en-têtes HTTP en variables d'environnement dans
467 <module>mod_cgi</module> et d'autres modules : dans les versions
468 précédentes, tout caractère invalide dans les noms d'en-têtes
469 était tout simplement remplacé par un caractère '_', ce qui
470 pouvait exposer à des attaques de type cross-site-scripting via
471 injection d'en-têtes (voir <a
472 href="http://events.ccc.de/congress/2007/Fahrplan/events/2212.en.html">Bogues
473 du Web inhabituelles</a>, planche 19/20).</p>
475 <p>Si vous devez supporter un client qui envoie des en-têtes non
476 conformes et si ceux-ci ne peuvent pas être corrigés, il existe
477 une solution de contournement simple mettant en jeu les modules
478 <module>mod_setenvif</module> et <module>mod_header</module>,
479 et permettant de prendre en compte ces en-têtes :</p>
483 # L'exemple suivant montre comment prendre en compte un en-tête<br />
484 # Accept_Encoding non conforme envoyé par un client.<br />
486 SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1<br />
487 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
492 <section id="misbehaving">
493 <title>Modification du comportement protocolaire face à des clients
494 réagissant de manière non conforme</title>
496 <p>Les versions antérieures recommandaient l'ajout de ces lignes dans
497 httpd.conf pour tenir compte de problèmes connus avec certains clients.
498 Comme les clients concernés sont maintenant très peu utilisés, cet
499 ajout n'est pratiquement plus nécessaire.</p>
502 # The following directives modify normal HTTP response behavior.<br />
503 # The first directive disables keepalive for Netscape 2.x and browsers that<br />
504 # spoof it. There are known problems with these browser implementations.<br />
505 # The second directive is for Microsoft Internet Explorer 4.0b2<br />
506 # which has a broken HTTP/1.1 implementation and does not properly<br />
507 # support keepalive when it is used on 301 or 302 (redirect) responses.<br />
509 BrowserMatch "Mozilla/2" nokeepalive<br />
510 BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0<br />
513 # The following directive disables HTTP/1.1 responses to browsers which<br />
514 # are in violation of the HTTP/1.0 spec by not being able to grok a<br />
515 # basic 1.1 response.<br />
517 BrowserMatch "RealPlayer 4\.0" force-response-1.0<br />
518 BrowserMatch "Java/1\.0" force-response-1.0<br />
519 BrowserMatch "JDK/1\.0" force-response-1.0
523 <section id="no-img-log">
524 <title>Ne pas tracer les requêtes pour des images dans le fichier de
525 trace des accès</title>
527 <p>Dans cet exemple, les requêtes pour des images n'apparaissent pas
528 dans le fichier de trace des accès. Il peut être facilement adapté pour
529 empêcher le traçage de répertoires particuliers, ou de requêtes
530 en provenance de certains hôtes.</p>
532 SetEnvIf Request_URI \.gif image-request<br />
533 SetEnvIf Request_URI \.jpg image-request<br />
534 SetEnvIf Request_URI \.png image-request<br />
535 CustomLog logs/access_log common env=!image-request
539 <section id="image-theft">
540 <title>Prévention du "Vol d'image"</title>
542 <p>Cet exemple montre comment empêcher les utilisateurs ne faisant pas
543 partie de votre serveur d'utiliser des images de votre serveur comme
544 images en ligne dans leurs pages. Cette configuration n'est pas
545 recommandée, mais elle peut fonctionner dans des circonstances bien
546 définies. Nous supposons que toutes vos images sont enregistrées dans
547 un répertoire nommé <code>/web/images</code>.</p>
549 SetEnvIf Referer "^http://www\.example\.com/" local_referal<br />
550 # Allow browsers that do not send Referer info<br />
551 SetEnvIf Referer "^$" local_referal<br />
552 <Directory /web/images><br />
554 Order Deny,Allow<br />
556 Allow from env=local_referal
561 <p>Pour plus d'informations sur cette technique, voir le tutoriel sur
563 "<a href="http://www.serverwatch.com/tutorials/article.php/1132731"
564 >Keeping Your Images from Adorning Other Sites</a>".</p>