Amener Apache à modifier les pages Web statiques à la volée
Question
J'ai expérimenté woopra.com Un outil d'analyse Web.Ce qui nécessite d'ajouter un morceau de code javascript à chaque page pour fonctionner.C'est assez simple avec des sites plus dynamiques avec des en-têtes ou des pieds de page universels, mais pas pour des pages HTML totalement statiques.
J'ai essayé de contourner ce problème en utilisant une combinaison de réécritures Apache et de SSI pour « envelopper » le code HTML statique avec le code requis.Par exemple...
J'ai apporté les modifications suivantes à ma configuration Apache
RewriteEngine On
RewriteCond %{REQUEST_URI} !=test.shtml
RewriteCond %{IS_SUBREQ} false
RewriteRule (.*)\.html test.shtml?$1.html
Le fichier test.shtml contient...
<script type="text/javascript">
var XXXXid = 'xxxxxxx';
</script>
<script src="http://xxxx.woopra.com/xx/xxx.js"></script>
<!--#set var="page" value="$QUERY_STRING" -->
<!--#include virtual= $page -->
L'idée était qu'une demande arrivant pour
/abc.html
serait redirigé vers
/test.shtml?abc.html
le shtml inclurait alors le fichier original dans la page de réponse.
Malheureusement, cela ne fonctionne pas comme prévu :) quelqu'un peut-il voir ce que je fais de mal ou peut-être suggérer une approche alternative.Existe-t-il des modules Apache qui pourraient faire la même chose.De préférence, cela peut être configuré par site.
Merci
Pierre
La solution
je pense que mod_filter_ext est le module que vous recherchez.Vous pouvez par exemple écrire un court script Perl pour insérer le code JS dans les pages et l'enregistrer pour traiter les pages HTML :
while (<>) {
s/<html>/\Q<script>....\E/;
print $_;
}
Vous pourriez même utiliser quelque chose comme sed
pour effectuer la substitution.
Autres conseils
Si les pages sont statiques, pourquoi les modifieriez-vous à la volée au lieu de prétraiter toutes les pages d'un site, en ajoutant le morceau de javascript requis à chacune d'elles ?C'est simple et probablement plus efficace (vous avez probablement plus de pages vues que de pages à modifier)
Cela pourrait être fait de plusieurs manières.Je suggérerais un petit Perl pour le remplacement en ligne.
ok, le plus gros problème de la méthode ci-dessus est qu'elle briserait votre validité HTML en plaçant une balise de script en dehors du <html>
Mots clés
je serais d'accord avec les autres sur un pré-processus exécuté sur vos fichiers HTML tel qu'un script sed/awk
voici un exemple rapide {en supposant que la partie script puisse être ajoutée avant le </head>
et que le </head>
est au début d'une nouvelle ligne
#!/bin/bash
cd /var/webserver/whatever/
grep -r '<\/head>' */*|grep "^.*\.html*:" >/var/tmp/tempfile.txt
((lines = $(wc -l /var/tmp/dom-tempfile.txt | awk '{print $1}')))
if [ $lines -gt 0 ]
then
while read line; do
sed 's/<script type="text\/javascript"> var XXXXid = "xxxxxxx"; <\/script><script src="http:\/\/xxxx\.woopra\.com\/xx\/xxx\.js"><\/script><\/head>/^<\/head>/g' $line>/var/tmp/tempfile.htm
mv /var/tmp/tempfile.htm $line
done < <(sed 's/\(^.*\.html*\):.*$/\1/' /var/tmp/tempfile.txt)
fi
exit 0
Il se peut que vous ayez une erreur de syntaxe puisque $page
n'est pas inclus dans les guillemets, mais les deux principales raisons pour lesquelles ce n'est pas le cas sont les suivantes :
- inclure virtual doit être un chemin commençant par /, dans votre exemple, la chaîne de requête doit être /abc.html , pas abc.html
la règle de réécriture doit également commencer par le chemin, donc la règle de réécriture doit être
RewriteRule ^(.*)\.html /test.shtml?$1.html