Serveur Apache HTTP Version 2.4
Description: | Fait traiter le corps de la réponse par un programme externe avant de l'envoyer au client |
---|---|
Statut: | Extension |
Identificateur de Module: | ext_filter_module |
Fichier Source: | mod_ext_filter.c |
mod_ext_filter
représente un modèle de
programmation simple et bien connu pour les filtres. Avec ce module, tout programme
qui lit l'entrée standard stdin et écrit sur la sortie standard
stdout (autrement dit une commande filtre de style Unix) peut
servir de filtre pour Apache. Ce mécanisme de filtrage est beaucoup
plus lent qu'un filtre spécialement écrit pour
l'API d'Apache et faisant partie intégrante du processus du serveur
Apache, mais il présente les avantages suivants :
Même dans le cas où le niveau de performance est insuffisant pour
une utilisation en production, on peut utiliser
mod_ext_filter
comme prototype d'environnement pour
les filtres.
# la directive de mod_ext_filter définissant un filtre # permettant de mettre des fichiers text/c au format HTML en # utilisant le programme externe /usr/bin/enscript, le type du # fichier résultant étant défini à text/html ExtFilterDefine c-to-html mode=output \ intype=text/c outtype=text/html \ cmd="/usr/bin/enscript --color -w html -Ec -o -" <Directory "/export/home/trawick/apacheinst/htdocs/c"> # directive de base permettant de traiter la sortie avec le # nouveau filtre SetOutputFilter c-to-html # directive de mod_mime définissant le type des fichiers dont # le nom possède l'extension .c à text/c AddType text/c .c </Directory>
Note : cet exemple avec gzip n'est fourni qu'à titre
d'illustration. Veuillez vous reporter à la documentation de
mod_deflate
pour un exemple d'implémentation plus
pratique.
# la directive de mod_ext_filter qui définit le filtre externe ExtFilterDefine gzip mode=output cmd=/bin/gzip <Location "/gzipped"> # directive de base permettant de traiter la sortie avec le # filtre gzip SetOutputFilter gzip # la directive de mod_headers permettant d'ajouter le champ # d'en-tête "Content-Encoding: gzip" Header set Content-Encoding gzip </Location>
# directive de mod_ext_filter définissant un filtre qui fait # passer tous les flux en sortie par la commande cat ; cat ne # modifie rien ; elle ne fait que compliquer le cheminement des # flux et consommer des ressources supplémentaires ExtFilterDefine slowdown mode=output cmd=/bin/cat \ ExtFilterDefine slowdown mode=output cmd=/bin/cat \ preservescontentlength <Location "/"> # directive de base permettant de traiter plusieurs fois la # sortie avec le filtre slowdown # SetOutputFilter slowdown;slowdown;slowdown </Location>
# directive de mod_ext_filter définissant un filtre qui # remplace du texte dans la réponse # ExtFilterDefine fixtext mode=output intype=text/html \ cmd="/bin/sed s/verdana/arial/g" <Location "/"> # directive de base permettant de traiter la sortie avec le # filtre fixtext SetOutputFilter fixtext </Location>
Vous pouvez aussi utiliser mod_substitute
pour
effectuer le même traitement sans avoir à invoquer un programme
externe.
# Trace les données lues et écrites par mod_deflate pour un # client particulier (IP 192.168.1.31) qui a des problèmes de # compression. # Ce premier filtre va tracer ce qui entre dans mod_deflate. ExtFilterDefine tracebefore \ cmd="/bin/tracefilter.pl /tmp/tracebefore" \ EnableEnv=trace_this_client # Ce second filtre va tracer ce qui sort de mod_deflate. # Notez que sans le paramètre ftype, le type de filtre par # défaut AP_FTYPE_RESOURCE placerait le filtre *avant* # mod_deflate dans la chaîne de filtrage. Le fait d'affecter # à ce paramètre une valeur numérique sensiblement supérieure à # AP_FTYPE_CONTENT_SET permet de s'assurer que le filtre sera # placé après mod_deflate. ExtFilterDefine traceafter \ cmd="/bin/tracefilter.pl /tmp/traceafter" \ EnableEnv=trace_this_client ftype=21 <Directory "/usr/local/docs"> SetEnvIf Remote_Addr 192.168.1.31 trace_this_client SetOutputFilter tracebefore;deflate;traceafter </Directory>
#!/usr/local/bin/perl -w use strict; open(SAVE, ">$ARGV[0]") or die "can't open $ARGV[0]: $?"; while (<STDIN>) { print SAVE $_; print $_; } close(SAVE);
Description: | Définit un filtre externe |
---|---|
Syntaxe: | ExtFilterDefine nom_filtre paramètres |
Contexte: | configuration du serveur |
Statut: | Extension |
Module: | mod_ext_filter |
La directive ExtFilterDefine
définit les caractéristiques d'un filtre externe, et en particulier
le programme à exécuter ainsi que ses arguments.
nom_filtre spécifie le nom du filtre en cours de
définition. On peut ensuite utiliser ce nom pour référencer le
filtre dans les directives SetOutputFilter
. Il doit être unique parmi les noms de
tous les filtres enregistrés. Pour le moment, aucune erreur
n'est signalée par l'API register-filter, si bien qu'un problème de
noms dupliqués ne sera pas porté à la connaissance de
l'utilisateur.
Viennent ensuite un ou plusieurs paramètres dans un ordre
indéfini, qui permettent de spécifier la commande externe à exécuter
et certaines autres caractéristiques. Le seul paramètre obligatoire
est cmd=
. Voici la liste de ces paramètres :
cmd=ligne de commande
cmd=
spécifie la commande
externe à exécuter. Si la ligne de commande comporte des
arguments, elle doit être entourée de guillemets (par exemple
cmd="/bin/mypgm arg1
arg2"
). Les guillemets habituels du shell ne
sont pas nécessaires car le programme est lancé directement, sans
passer par le shell. Les arguments du programme doivent être
séparés par des espaces. Si un argument contient des espaces, ces
derniers doivent être échappés par un antislash '\'. Si un
argument contient des antislashes '\', ces derniers doivent être
eux-mêmes échappés par un antislash '\'. Outre les variables
d'environnement CGI standards, les variables DOCUMENT_URI,
DOCUMENT_PATH_INFO, et QUERY_STRING_UNESCAPED seront également
définies pour le programme.mode=mode
mode=output
(valeur par défaut) pour les
filtres qui traitent les réponses. Utilisez
mode=input
pour les filtres qui traitent les
requêtes. mode=input
est disponible depuis la version
2.1 d'Apache.intype=type MIME
intype=
ne sera filtré.outtype=type MIME
PreservesContentLength
PreservesContentLength
indique que le
filtre doit conserver la taille du contenu. Ce n'est pas le
comportement par défaut, car la plupart des filtres modifient cette
taille. Ce mot-clé doit être spécifié si le filtre ne doit pas
modifier la taille du contenu.ftype=type de filtre
disableenv=env
enableenv=env
Description: | Configure les options de
mod_ext_filter |
---|---|
Syntaxe: | ExtFilterOptions option [option] ... |
Défaut: | ExtFilterOptions NoLogStderr |
Contexte: | répertoire |
Statut: | Extension |
Module: | mod_ext_filter |
La directive ExtFilterOptions
spécifie des options de traitement particulières pour
mod_ext_filter
. Les arguments option
peuvent contenir :
LogStderr | NoLogStderr
LogStderr
indique que les messages
envoyés par le programme de filtrage externe sur la sortie
d'erreurs standard doivent être enregistrés dans le journal des
erreurs d'Apache. NoLogStderr
inverse ce
comportement.Onfail=[abort|remove]
abort
(la valeur par
défaut), le traitement de la requête sera abandonné. Avec remove
, le
filtre est supprimé, et le traitement de la requête se poursuit
sans lui.ExtFilterOptions LogStderr
Les messages envoyés vers la sortie d'erreurs standard du filtre seront enregistrés dans le journal des erreurs d'Apache.