1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
|
<?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 : 729317 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<!-- $LastChangedRevision: 2009010501 $ -->
<!--
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 propose un mécanisme de stockage d'informations
dans des variables appelées <em>variables d'environnement</em>. Ces
informations peuvent servir à contrôler diverses opérations comme
l'enregistrement des traces ou le contrôle d'accès. On utilise aussi ces
variables dans le mécanisme de communication avec les programmes externes
comme les scripts CGI. Ce document présente différentes méthodes pour
manipuler et utiliser ces variables.</p>
<p>Bien que ces variables soient référencées comme <em>variables
d'environnement</em>, il ne faut pas les confondre avec les variables
d'environnement contrôlées par le système d'exploitation sous-jacent.
En fait, ces variables sont stockées et manipulées dans une structure
interne à Apache. Elles ne deviennent de véritables variables
d'environnement du système d'exploitation que lorsqu'elles sont mises à la
disposition de scripts CGI et de scripts inclus côté serveur (SSI). Si vous
souhaitez manipuler l'environnement du système d'exploitation sous lequel
le serveur s'exécute, vous devez utiliser les mécanismes standards de
manipulation de l'environnement fournis par l'interpréteur de commandes
(shell) de votre système d'exploitation.</p>
</summary>
<section id="setting">
<title>Définition des 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 de base de l'environnement</title>
<p>La méthode la plus élémentaire pour définir une variable
d'environnement au niveau d'Apache consiste à utiliser la directive
inconditionnelle <directive module="mod_env"
>SetEnv</directive>. Les variables peuvent aussi être transmises depuis
l'environnement du shell à partir duquel le serveur a été démarré en
utilisant la directive
<directive module="mod_env">PassEnv</directive>.</p>
</section>
<section id="conditional">
<title>Définitions conditionnelles en fonction des requêtes</title>
<p>Pour plus de souplesse, les directives fournies par le module
<module>mod_setenvif</module> permettent de définir les
variables d'environnement en tenant compte des caractéristiques
de chaque requête. Par exemple, une
variable pourrait n'être définie que lorsqu'un navigateur spécifique
(User-Agent) a généré la requête, ou seulement quand un en-tête
Referer particulier est présent. La directive
<directive module="mod_rewrite">RewriteRule</directive> du module
<module>mod_rewrite</module> qui utilise l'option
<code>[E=...]</code> pour définir
les variables d'environnement apporte encore plus de souplesse.</p>
</section>
<section id="unique-identifiers">
<title>Identifiants uniques</title>
<p>Finalement, le module <module>mod_unique_id</module> définit la variable
d'environnement <code>UNIQUE_ID</code> pour chaque requête à une valeur
qui est garantie unique parmi "toutes" les requêtes sous des
conditions très spécifiques.</p>
</section>
<section id="standard-cgi">
<title>Variables CGI standards</title>
<p>En plus de l'ensemble des variables d'environnement internes à la
configuration d'Apache et de celles transmises depuis le shell,
les scripts CGI et les pages SSI
se voient affectés un ensemble de variables
d'environnement contenant des méta-informations à propos de la requête
comme préconisé dans la
<a href="http://cgi-spec.golux.com/">spécification
sur les CGIs</a>.</p>
</section>
<section id="caveats">
<title>Quelques mises en garde</title>
<ul>
<li>Les directives de manipulation de l'environnement ne permettent
pas de supplanter ou modifier les variables CGI standards.</li>
<li>Lorsqu'on utilise <program>suexec</program> pour exécuter des
scripts CGI, l'environnement est nettoyé et réduit à un ensemble de
variables <em>sûres</em> avant l'exécution du script. La liste des
variables <em>sûres</em> est définie à la compilation dans
<code>suexec.c</code>.</li>
<li>Pour des raisons de portabilité, les noms des variables
d'environnement ne peuvent contenir que des lettres, des chiffres, et
le caractère "sousligné". En outre, le premier caractère ne doit pas
être un chiffre. Les caractères qui ne satisfont pas à ces conditions
seront remplacés par un caractère "sousligné" quand ils seront
transmis aux scripts CGI et aux pages SSI.</li>
<li>La directive <directive
module="mod_env">SetEnv</directive> s'exécute assez tard au
cours du traitement de la requête, ce qui signifie que des
directives telles que <directive
module="mod_setenvif">SetEnvIf</directive> et <directive
module="mod_rewrite">RewriteCond</directive> ne verront pas
les variables qu'elle aura définies.</li>
</ul>
</section>
</section>
<section id="using">
<title>Utilisation des variables d'environnement</title>
<related>
<modulelist>
<module>mod_authz_host</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_authz_host">Allow</directive>
<directive module="mod_log_config">CustomLog</directive>
<directive module="mod_authz_host">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>La communication d'informations aux scripts CGI constitue une des
principales utilisations des variables d'environnement. Comme indiqué
plus haut, l'environnement transmis aux scripts CGI comprend des
méta-informations standards à propos de la requête, en plus des
variables définies dans la configuration d'Apache. Pour plus de
détails, se référer au
<a href="howto/cgi.html">tutoriel CGI</a>.</p>
</section>
<section id="ssi-pages">
<title>Pages SSI</title>
<p>Les documents inclus côté serveur (SSI) traités par le filtre
<code>INCLUDES</code> du module <module>mod_include</module>,
peuvent afficher les
variables d'environnement à l'aide de l'élément <code>echo</code>,
et peuvent utiliser des variables d'environnement dans les éléments
de contrôle de flux pour rendre certaines parties d'une page
conditionnelles en fonction des caractéristiques de la requête.
Apache fournit aussi les variables d'environnement CGI standards
aux pages SSI
comme indiqué plus haut. Pour plus de détails, se référer au
<a href="howto/ssi.html">tutoriel SSI</a>.</p>
</section>
<section id="access-control">
<title>Contrôle d'accès</title>
<p>L'accès au serveur peut être contrôlé en fonction de la valeur de
variables d'environnement à l'aide des directives
<code>allow from env=</code> et <code>deny from env=</code>.
En association avec la directive
<directive module="mod_setenvif">SetEnvIf</directive>, ceci confère une
grande souplesse au contrôle d'accès au serveur en fonction des
caractéristiques du client. Par exemple, vous pouvez utiliser ces
directives pour interdire l'accès depuis un navigateur particulier
(User-Agent).
</p>
</section>
<section id="logging">
<title>Enregistrement conditionnel des traces</title>
<p>Les variables d'environnement peuvent être enregistrées dans le
fichier de log des accès à l'aide de l'option <code>%e</code> de la
directive <directive module="mod_log_config">LogFormat</directive>.
En outre, la décision de tracer ou non les requêtes peut être prise
en fonction de l'état de variables d'environnement en utilisant la
forme conditionnelle de la directive
<directive module="mod_log_config">CustomLog</directive>. En
association avec la directive <directive module="mod_setenvif"
>SetEnvIf</directive>, ceci confère une grande souplesse au contrôle
du traçage des requêtes. Par exemple, vous pouvez choisir de ne pas
tracer les requêtes pour des noms de fichiers se terminant par
<code>gif</code>, ou encore de ne tracer que les requêtes des clients
n'appartenant pas à votre sous-réseau.</p>
</section>
<section id="response-headers">
<title>En-têtes de réponse conditionnels</title>
<p>La directive <directive module="mod_headers">Header</directive>
peut se baser sur la présence ou l'absence d'une variable
d'environnement pour décider si un certain en-tête HTTP sera placé
dans la réponse au client. Ceci permet, par exemple, de n'envoyer un
certain en-tête de réponse que si un en-tête correspondant est présent
dans la requête du client.</p>
</section>
<section id="external-filter">
<title>Activation de filtres externes</title>
<p>Les filtres externes configurés par le module
<module>mod_ext_filter</module> à l'aide de la directive <directive
module="mod_ext_filter">ExtFilterDefine</directive> peuvent être
activés de manière conditionnelle en fonction d'une variable
d'environnement à l'aide des 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:<em>variable</em>}</code> de
<em>TestString</em> dans la
directive <directive module="mod_rewrite">RewriteCond</directive>
permet au moteur de réécriture du module
<module>mod_rewrite</module> de prendre des
décisions conditionnées par des variables d'environnement.
Notez que les variables accessibles dans
<module>mod_rewrite</module> sans le préfixe
<code>ENV:</code> ne sont pas de véritables variables
d'environnement. Ce sont plutôt des variables spécifiques à
<module>mod_rewrite</module>
qui ne sont pas accessibles pour les autres modules.</p>
</section>
</section>
<section id="special">
<title>Variables d'environnement à usage spécial</title>
<p>Des problèmes d'interopérabilité ont conduit à l'introduction de
mécanismes permettant de modifier le comportement d'Apache lorsqu'il
dialogue avec certains clients. Afin de rendre ces mécanismes aussi
souples que possible, ils sont invoqués en définissant des variables
d'environnement, en général à l'aide de la directive
<directive module="mod_setenvif">BrowserMatch</directive>, bien que les
directives <directive module="mod_env">SetEnv</directive> et
<directive module="mod_env">PassEnv</directive> puissent aussi être
utilisées, par exemple.</p>
<section id="downgrade">
<title>downgrade-1.0</title>
<p>Ceci force le traitement d'une requête comme une requête HTTP/1.0
même si elle a été rédigée dans un langage plus récent.</p>
</section>
<section id="force-gzip">
<title>force-gzip</title>
<p>Si le filtre <code>DEFLATE</code> est activé, cette variable
d'environnement ignorera les réglages accept-encoding de votre
navigateur et enverra une sortie compressée inconditionnellement.</p>
</section>
<section id="force-no-vary">
<title>force-no-vary</title>
<p>Cette variable entraîne la suppression de tout champ
<code>Vary</code> des en-têtes de la réponse avant que cette dernière
soit renvoyée au client. Certains clients n'interprètent pas ce champ
correctement, et la définition de cette variable permet de contourner
ce problème, mais implique aussi la définition de
<strong>force-response-1.0</strong>.</p>
</section>
<section id="force-response">
<title>force-response-1.0</title>
<p>Cette variable force une réponse en langage HTTP/1.0 aux clients
qui envoient des requêtes dans le même langage. Elle fut implémentée à
l'origine suite à des problèmes avec les mandataires d'AOL. Certains
clients en langage HTTP/1.0 ne réagissent pas correctement face à une
réponse en langage HTTP/1.1, et cette variable peut être utilisée pour
assurer l'interopérabilité avec eux.</p>
</section>
<section id="gzip-only-text-html">
<title>gzip-only-text/html</title>
<p>Positionnée à "1", cette variable désactive le filtre en sortie
<code>DEFLATE</code> fourni par le module <module>mod_deflate</module> pour les
types de contenu autres que <code>text/html</code>. Si vous préférez
utiliser des fichiers compressés statiquement,
<module>mod_negotiation</module> évalue aussi la variable (non
seulement pour gzip, mais aussi pour tous les encodages autres que
"identity").</p>
</section>
<section id="no-gzip"><title>no-gzip</title>
<p>Quand cette variable est définie, le filtre <code>DEFLATE</code> du
module <module>mod_deflate</module> est désactivé, et
<module>mod_negotiation</module> refusera de délivrer des ressources
encodées.</p>
</section>
<section id="no-cache"><title>no-cache</title>
<p>Lorsque cette variable est définie,
<module>mod_cache</module> ne sauvegardera pas de réponse
susceptible d'être mise en cache. Cette variable d'environnement
n'a aucune incidence sur le fait qu'une réponse déjà enregistrée
dans la cache soit utilisée ou non pour la requête courante.</p>
</section>
<section id="nokeepalive">
<title>nokeepalive</title>
<p>Quand cette variable est définie, la directive
<directive module="core">KeepAlive</directive> est désactivée.</p>
</section>
<section id="prefer-language"><title>prefer-language</title>
<p>Cette variable modifie le comportement du module
<module>mod_negotiation</module>. Si elle contient un symbole de
langage (tel que <code>en</code>, <code>ja</code>
ou <code>x-klingon</code>), <module>mod_negotiation</module> essaie de
délivrer une variante dans ce langage. S'il n'existe pas de telle
variante, le processus normal de
<a href="content-negotiation.html">négociation</a> s'applique.</p>
</section>
<section id="redirect-carefully">
<title>redirect-carefully</title>
<p>Cette variable force le serveur à être plus prudent lors de l'envoi
d'une redirection au client. Elle est en général utilisée quand un
client présente un problème connu avec les redirections. Elle fut
implémentée à l'origine suite a un problème rencontré avec le logiciel
WebFolders de Microsoft qui ne gère pas correctement les redirections
vers des ressources de type répertoire via des méthodes DAV.</p>
</section>
<section id="suppress-error-charset">
<title>suppress-error-charset</title>
<p><em>Disponible dans les versions postérieures à 2.0.54</em></p>
<p>Quand Apache génère une redirection en réponse à une requête client,
la réponse inclut un texte destiné à être affiché au cas où le client ne
suivrait pas, ou ne pourrait pas suivre automatiquement la redirection.
Habituellement, Apache marque ce texte en accord avec le jeu de caractères
qu'il utilise, à savoir ISO-8859-1.</p>
<p> Cependant, si la redirection fait référence à une page qui utilise un
jeu de caractères différent, certaines versions de navigateurs obsolètes
essaieront d'utiliser le jeu de caractères du texte de la redirection
plutôt que celui de la page réelle.
Ceci peut entraîner, par exemple, un rendu incorrect du Grec.</p>
<p>Si cette variable d'environnement est définie, Apache omettra le jeu de
caractères pour le texte de la redirection, et les navigateurs obsolètes
précités utiliseront correctement celui de la page de destination.</p>
<note type="warning">
<title>Note concernant la sécurité</title>
<p>L'envoi de pages d'erreur sans spécifier un jeu de caractères peut
conduire à des attaques de type "cross-site-scripting" pour les
navigateurs qui ne respectent pas la spécification HTTP/1.1 (MSIE) et
tentent de déduire le jeu de caractères à partir du contenu. De tels
navigateurs peuvent être facilement trompés et utiliser le jeu de
caractères UTF-7 ; les contenus des données en entrée de type UTF-7
(comme les URI de requête) ne seront alors plus protégés par les
mécanismes d'échappement usuels conçus pour prévenir les attaques
de type "cross-site-scripting".</p>
</note>
</section>
<section id="proxy"><title>force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked,
proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled</title>
<p>Ces directives modifient le comportement protocolaire du module
<module>mod_proxy</module>. Voir la documentation sur
<module>mod_proxy</module> et <module>mod_proxy_http</module> pour plus de détails.</p>
</section>
</section>
<section id="examples">
<title>Exemples</title>
<section id="misbehaving">
<title>Modification du comportement protocolaire face à des clients
réagissant de manière non conforme</title>
<p>Les versions antérieures recommandaient l'ajout de ces lignes dans
httpd.conf pour tenir compte de problèmes connus avec certains clients.
Comme les clients concernés sont maintenant très peu utilisés, cet
ajout n'est pratiquement plus nécessaire.</p>
<example><pre>
#
# The following directives modify normal HTTP response behavior.
# The first directive disables keepalive for Netscape 2.x and browsers that
# spoof it. There are known problems with these browser implementations.
# The second directive is for Microsoft Internet Explorer 4.0b2
# which has a broken HTTP/1.1 implementation and does not properly
# support keepalive when it is used on 301 or 302 (redirect) responses.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
#
# The following directive disables HTTP/1.1 responses to browsers which
# are in violation of the HTTP/1.0 spec by not being able to grok a
# basic 1.1 response.
#
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 tracer les requêtes pour des images dans le fichier de
trace des accès</title>
<p>Dans cet exemple, les requêtes pour des images n'apparaissent pas
dans le fichier de trace des accès. Il peut être facilement adapté pour
empêcher le traçage de répertoires particuliers, ou de requêtes
en provenance de certains hôtes.</p>
<example>
SetEnvIf Request_URI \.gif image-request<br />
SetEnvIf Request_URI \.jpg image-request<br />
SetEnvIf Request_URI \.png image-request<br />
CustomLog logs/access_log common env=!image-request
</example>
</section>
<section id="image-theft">
<title>Prévention du "Vol d'image"</title>
<p>Cet exemple montre comment empêcher les utilisateurs ne faisant pas
partie de votre serveur d'utiliser des images de votre serveur comme
images en ligne dans leurs pages. Cette configuration n'est pas
recommandée, mais elle peut fonctionner dans des circonstances bien
définies. Nous supposons que toutes vos images sont enregistrées dans
un répertoire nommé <code>/web/images</code>.</p>
<example>
SetEnvIf Referer "^http://www\.example\.com/" local_referal
# Allow browsers that do not send Referer info
SetEnvIf Referer "^$" local_referal
<Directory /web/images>
<indent>
Order Deny,Allow<br />
Deny from all<br />
Allow from env=local_referal
</indent>
</Directory>
</example>
<p>Pour plus d'informations sur cette technique, voir le tutoriel sur
ServerWatch
"<a href="http://www.serverwatch.com/tutorials/article.php/1132731"
>Keeping Your Images from Adorning Other Sites</a>".</p>
</section>
</section>
</manualpage>
|