<-
Apache > Serveur HTTP > Documentation > Version 2.5 > Modules

Module Apache mod_ext_filter

Langues Disponibles:  en  |  fr  |  ja  |  ko 

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

Sommaire

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.

Sujets

Directives

Traitement des bugs

Voir aussi

top

Exemples

Générer du HTML à partir d'un autre type de contenu

# 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>

Implémentation d'un filtre de codage de contenu

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>

Ralentissement du serveur

# 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>

Utilisation de sed pour remplacer du texte dans la réponse

# 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.

Tracer un autre filtre

# 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>

Voici le filtre qui trace les données :

#!/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);
top

Directive ExtFilterDefine

Description:Définit un filtre externe
Syntaxe:ExtFilterDefine nom_filtre paramètres
Contexte:configuration globale
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
Le mot-clé 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
Utilisez 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
Ce paramètre spécifie le type de médium Internet (c'est à dire le type MIME) des documents qui doivent être filtrés. Par défaut, tous les documents sont filtrés. Aucun des documents possédant un type MIME autre que celui spécifié par intype= ne sera filtré.
outtype=type MIME
Ce paramètre spécifie le type de médium Internet (c'est à dire le type MIME) des documents filtrés. Il intervient lorsque les opérations de filtrage comprennent une modification du type MIME. Par défaut, le type MIME n'est pas modifié.
PreservesContentLength
Le mot-clé 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
Ce paramètre spécifie une valeur numérique représentant le type de filtre sous lequel le filtre doit être enregistré. La valeur par défaut, AP_FTYPE_RESOURCE, convient dans la plupart des situations. Ce paramètre devient nécessaire dès lors que le filtre doit opérer à un autre point de la chaîne de filtrage que les filtres de ressources. Voir les définitions de AP_FTYPE_... dans util_filter.h pour trouver une valeur appropriée.
disableenv=env
Ce paramètre spécifie le nom d'une variable d'environnement qui, si elle est définie, va désactiver le filtre.
enableenv=env
Ce paramètre spécifie le nom d'une variable d'environnement qui doit être définie pour que le filtre ne soit pas désactivé.
top

Directive ExtFilterOptions

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
Le mot-clé 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]
Indique la marche à suivre si le programme de filtrage externe ne peut pas démarrer. Avec 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.

Langues Disponibles:  en  |  fr  |  ja  |  ko 

top

Commentaires

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.