Chegando Apache para modificar páginas web estáticas na mosca
Pergunta
Eu tenho vindo a experimentar com woopra.com Uma ferramenta de análise da web.O que exige um pedaço de código javascript a ser adicionado a cada página para a função.Isso é muito fácil, com mais sites dinâmicos com a universal cabeçalhos ou rodapés, mas não para totalmente páginas html estáticas.
Tentei trabalhar redonda-lo usando uma combinação da Apache reescreve e SSI para "Quebrar" o estático html com o código necessário.Por exemplo...
Eu fiz as seguintes alterações na configuração do apache
RewriteEngine On
RewriteCond %{REQUEST_URI} !=test.shtml
RewriteCond %{IS_SUBREQ} false
RewriteRule (.*)\.html test.shtml?$1.html
O teste.shtml ficheiro contém...
<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 -->
A idéia era que um pedido vindo para
/abc.html
seria redirecionado para
/test.shtml?abc.html
o shtml seria, então, incluir o arquivo original para a página de resposta.
Infelizmente, ele não funciona muito bem como planejado :) alguém pode ver o que eu estou fazendo de errado, ou talvez sugerir uma abordagem alternativa.Existe alguma módulos do apache que poderia fazer a mesma coisa.De preferência, que pode ser configurado em uma base por site.
Obrigado
Pedro
Solução
Eu acho que mod_filter_ext é o módulo que você está procurando.Você pode escrever um pequeno script Perl de exemplo, para inserir o código JS nas páginas e registrá-lo para o processo de páginas HTML:
while (<>) {
s/<html>/\Q<script>....\E/;
print $_;
}
Você pode até mesmo usar algo como sed
para efectuar a substituição.
Outras dicas
Se as páginas são estáticas, por que você iria alterar-los em tempo real em vez de pré-processamento de todas as páginas em um site, adicionando o pedaço de necessários javascript para cada um deles?Isso é simples e, provavelmente, mais eficiente (você provavelmente terá mais visualizações de página de páginas para alterar)
Isso poderia ser feito um monte de caminho.Gostaria de sugerir uma pequena perl embutido substituição.
ok, o método acima, o maior problema é que ele iria quebrar a sua validade de html, colocando uma tag de script fora do <html>
tags
eu gostaria de concordar com os outros em um pré-processo de execução através de seus arquivos de html, tais como sed/script awk
aqui está um exemplo rápido {supondo que o script parte pode ser adicionado antes do </head>
e que o </head>
é o início de uma nova linha
#!/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
Você pode ter um erro de sintaxe, desde $page
não está incluído entre aspas, no entanto, as duas principais razões para isso não são os seguintes:
- incluem virtual deve um caminho que começa com /, no seu exemplo, a seqüência de caracteres de consulta deve ser o /abc.html , não abc.html
a regra de reescrita deve começar com o caminho do bem, de modo que a regra de reescrita tem de ser
RewriteRule ^(.*)\.html /test.shtml?$1.html