Serveur Apache HTTP Version 2.4
Deux types de variables d'environnement affectent le serveur HTTP Apache.
Le premier type correspond aux variables d'environnement contr�l�es par le syst�me d'exploitation sous-jacent et d�finies avant le d�marrage du serveur. Leurs valeurs peuvent �tre utilis�es directement dans les fichiers de configuration, et peuvent �ventuellement �tre transmises aux scripts CGI et SSI via la directive PassEnv.
Le second type correspond aux variables nomm�es appel�es aussi variables d'environnement dans lesquelles le serveur HTTP Apache stocke des informations via un m�canisme sp�cial. 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.
Bien que ces variables soient r�f�renc�es comme variables d'environnement, 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.
Modules Apparent�s | Directives Apparent�es |
---|---|
La m�thode la plus �l�mentaire pour d�finir une variable
d'environnement au niveau d'Apache consiste � utiliser la directive
inconditionnelle SetEnv
. Les variables peuvent aussi �tre transmises depuis
l'environnement du shell � partir duquel le serveur a �t� d�marr� en
utilisant la directive
PassEnv
.
Pour plus de souplesse, les directives fournies par le module
mod_setenvif
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
RewriteRule
du module
mod_rewrite
qui utilise l'option
[E=...]
pour d�finir
les variables d'environnement apporte encore plus de souplesse.
Finalement, le module mod_unique_id
d�finit la variable
d'environnement UNIQUE_ID
pour chaque requ�te � une valeur
qui est garantie unique parmi "toutes" les requ�tes sous des
conditions tr�s sp�cifiques.
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 sp�cification sur les CGIs.
suexec
pour ex�cuter des
scripts CGI, l'environnement est nettoy� et r�duit � un ensemble de
variables s�res avant l'ex�cution du script. La liste des
variables s�res est d�finie � la compilation dans
suexec.c
.SetEnv
s'ex�cute assez tard au
cours du traitement de la requ�te, ce qui signifie que des
directives telles que SetEnvIf
et RewriteCond
ne verront pas
les variables qu'elle aura d�finies.DirectoryIndex
), ou lorsqu'il g�n�re un
listing du contenu d'un r�pertoire via le module
mod_autoindex
, la sous-requ�te n'h�rite pas des
variables d'environnement sp�cifiques � la requ�te. En outre, � cause
des phases de l'API auxquelles mod_setenvif
prend
part, les directives SetEnvIf
ne sont pas �valu�es
s�par�ment dans la sous-requ�te.Modules Apparent�s | Directives Apparent�es |
---|---|
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 tutoriel CGI.
Les documents inclus c�t� serveur (SSI) trait�s par le filtre
INCLUDES
du module mod_include
,
peuvent afficher les
variables d'environnement � l'aide de l'�l�ment echo
,
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
tutoriel SSI.
L'acc�s au serveur peut �tre contr�l� en fonction de la valeur de
variables d'environnement � l'aide des directives
allow from env=
et deny from env=
.
En association avec la directive
SetEnvIf
, 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).
Les variables d'environnement peuvent �tre enregistr�es dans le
fichier de log des acc�s � l'aide de l'option %e
de la
directive LogFormat
.
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
CustomLog
. En
association avec la directive SetEnvIf
, 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
gif
, ou encore de ne tracer que les requ�tes des clients
n'appartenant pas � votre sous-r�seau.
La directive Header
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.
Les filtres externes configur�s par le module
mod_ext_filter
� l'aide de la directive ExtFilterDefine
peuvent �tre
activ�s de mani�re conditionnelle en fonction d'une variable
d'environnement � l'aide des options
disableenv=
et enableenv=
.
La forme %{ENV:variable}
de
TestString dans la
directive RewriteCond
permet au moteur de r��criture du module
mod_rewrite
de prendre des
d�cisions conditionn�es par des variables d'environnement.
Notez que les variables accessibles dans
mod_rewrite
sans le pr�fixe
ENV:
ne sont pas de v�ritables variables
d'environnement. Ce sont plut�t des variables sp�cifiques �
mod_rewrite
qui ne sont pas accessibles pour les autres modules.
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
BrowserMatch
, bien que les
directives SetEnv
et
PassEnv
puissent aussi �tre
utilis�es, par exemple.
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.
Si le filtre DEFLATE
est activ�, cette variable
d'environnement ignorera les r�glages accept-encoding de votre
navigateur et enverra une sortie compress�e inconditionnellement.
Cette variable entra�ne la suppression de tout champ
Vary
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
force-response-1.0.
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.
Positionn�e � "1", cette variable d�sactive le filtre en sortie
DEFLATE
fourni par le module mod_deflate
pour les
types de contenu autres que text/html
. Si vous pr�f�rez
utiliser des fichiers compress�s statiquement,
mod_negotiation
�value aussi la variable (non
seulement pour gzip, mais aussi pour tous les encodages autres que
"identity").
Quand cette variable est d�finie, le filtre DEFLATE
du
module mod_deflate
est d�sactiv�, et
mod_negotiation
refusera de d�livrer des ressources
encod�es.
Disponible dans les versions 2.2.12 et ult�rieures d'Apache
Lorsque cette variable est d�finie,
mod_cache
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.
Quand cette variable est d�finie, la directive
KeepAlive
est d�sactiv�e.
Cette variable modifie le comportement du module
mod_negotiation
. Si elle contient un symbole de
langage (tel que en
, ja
ou x-klingon
), mod_negotiation
essaie de
d�livrer une variante dans ce langage. S'il n'existe pas de telle
variante, le processus normal de
n�gociation s'applique.
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.
Disponible dans les versions post�rieures � 2.0.54
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.
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.
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.
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".
Ces directives modifient le comportement protocolaire du module
mod_proxy
. Voir la documentation sur
mod_proxy
et mod_proxy_http
pour plus de d�tails.
Avec la version 2.4, Apache est plus strict avec la conversion
des en-t�tes HTTP en variables d'environnement dans
mod_cgi
et d'autres modules : dans les versions
pr�c�dentes, tout caract�re invalide dans les noms d'en-t�tes
�tait tout simplement remplac� par un caract�re '_', ce qui
pouvait exposer � des attaques de type cross-site-scripting via
injection d'en-t�tes (voir Bogues
du Web inhabituelles, planche 19/20).
Si vous devez supporter un client qui envoie des en-t�tes non
conformes et si ceux-ci ne peuvent pas �tre corrig�s, il existe
une solution de contournement simple mettant en jeu les modules
mod_setenvif
et mod_headers
,
et permettant de prendre en compte ces en-t�tes :
# L'exemple suivant montre comment prendre en compte un en-t�te
# Accept_Encoding non conforme envoy� par un client. # SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
Les versions ant�rieures recommandaient l'ajout de ces lignes dans apache2.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.
# # 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
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.
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
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� /web/images
.
SetEnvIf Referer "^http://www\.example\.com/" local_referal # Autorise les navigateurs qui n'envoient aucune information de Referer SetEnvIf Referer "^$" local_referal <Directory /web/images> Require env local_referal </Directory>
Pour plus d'informations sur cette technique, voir le tutoriel sur ServerWatch "Keeping Your Images from Adorning Other Sites".