Far sì che Apache modifichi al volo le pagine Web statiche
Domanda
Ho sperimentato woopra.com Uno strumento di analisi web.Ciò richiede l'aggiunta di un pezzo di codice JavaScript a ciascuna pagina per funzionare.Questo è abbastanza facile con siti più dinamici con intestazioni o piè di pagina universali ma non con pagine HTML totalmente statiche.
Ho tentato di aggirare il problema utilizzando una combinazione di riscritture Apache e SSI per "avvolgere" l'HTML statico con il codice richiesto.Per esempio...
Ho apportato le seguenti modifiche alla mia configurazione di Apache
RewriteEngine On
RewriteCond %{REQUEST_URI} !=test.shtml
RewriteCond %{IS_SUBREQ} false
RewriteRule (.*)\.html test.shtml?$1.html
Il file test.shtml contiene...
<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'idea era che arrivasse una richiesta
/abc.html
verrebbe reindirizzato a
/test.shtml?abc.html
l'shtml includerebbe quindi il file originale nella pagina di risposta.
Sfortunatamente non funziona come previsto :) qualcuno può vedere cosa sto facendo di sbagliato o magari suggerire un approccio alternativo.Esistono moduli Apache che potrebbero fare la stessa cosa.Preferibilmente può essere configurato in base al sito.
Grazie
Peter
Soluzione
penso che mod_filter_ext è il modulo che stai cercando.Puoi scrivere un breve script Perl ad esempio per inserire il codice JS nelle pagine e registrarlo per elaborare le pagine HTML:
while (<>) {
s/<html>/\Q<script>....\E/;
print $_;
}
Potresti anche usare qualcosa del genere sed
per eseguire la sostituzione.
Altri suggerimenti
Se le pagine sono statiche, perché dovresti modificarle al volo invece di preelaborare tutte le pagine di un sito, aggiungendo il pezzo di Javascript richiesto a ciascuna di esse?Questo è semplice e probabilmente più efficace (probabilmente hai più pagine visualizzate che pagine da modificare)
Questo potrebbe essere fatto in molti modi.Suggerirei un piccolo perl per la sostituzione in linea.
ok, il problema più grande del metodo sopra è che interromperebbe la validità del tuo HTML inserendo un tag script all'esterno del file <html>
tag
Sarei d'accordo con gli altri su un pre-processo eseguito sui tuoi file html come uno script sed/awk
ecco un rapido esempio {assumendo che la parte dello script possa essere aggiunta prima del </head>
e che il </head>
è all'inizio di una nuova riga
#!/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
Potresti avere un errore di sintassi da allora $page
non è incluso tra virgolette, tuttavia i due motivi principali per cui ciò non è incluso sono i seguenti:
- includere virtual dovrebbe essere un percorso che inizia con /, nel tuo esempio la stringa di query dovrebbe essere /abc.html , non abc.html
anche la regola di riscrittura dovrebbe iniziare con il percorso, quindi deve esserlo
RewriteRule ^(.*)\.html /test.shtml?$1.html