Как заставить Apache изменять статические веб-страницы "на лету"
Вопрос
Я экспериментировал с woopra.com Инструмент веб-аналитики.Для этого требуется добавить фрагмент кода javascript на каждую страницу, чтобы он функционировал.Это достаточно просто для более динамичных сайтов с универсальными верхними или нижними колонтитулами, но не для полностью статичных html-страниц.
Я попытался обойти это, используя комбинацию Apache rewrites и SSI, чтобы "обернуть" статический html требуемым кодом.Например...
Я внес следующие изменения в свою конфигурацию apache
RewriteEngine On
RewriteCond %{REQUEST_URI} !=test.shtml
RewriteCond %{IS_SUBREQ} false
RewriteRule (.*)\.html test.shtml?$1.html
Файл test.shtml содержит...
<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 -->
Идея заключалась в том, что запрос, поступающий на
/abc.html
будет перенаправлен на
/test.shtml?abc.html
затем shtml включит исходный файл на страницу ответа.
К сожалению, это работает не совсем так, как планировалось :) кто-нибудь может увидеть, что я делаю неправильно, или, возможно, предложить альтернативный подход.Есть ли какие-либо модули apache, которые могли бы делать то же самое?Предпочтительно, чтобы это могло быть настроено для каждого сайта.
Спасибо
Питер
Решение
я думаю что mod_filter_ext это модуль, который вы ищете.Вы можете написать короткий Perl-скрипт, например, для вставки JS-кода в страницы и зарегистрировать его для обработки HTML-страниц:
while (<>) {
s/<html>/\Q<script>....\E/;
print $_;
}
Вы могли бы даже использовать что-то вроде sed
выполнить замену.
Другие советы
Если страницы статичны, зачем менять их на лету вместо того, чтобы предварительно обрабатывать все страницы сайта, добавляя к каждой из них фрагмент необходимого JavaScript?Это просто и, вероятно, более эффективно (вероятно, у вас больше просмотров страниц, чем страниц, которые нужно изменить).
Это можно сделать разными способами.Я бы предложил небольшой Perl для встроенной замены.
ок, самая большая проблема описанного выше метода заключается в том, что он нарушит вашу валидность html, поместив тег script вне <html>
Теги
я бы согласился с другими в отношении предварительной обработки ваших html-файлов, таких как скрипт sed / awk
вот краткий пример {предполагая, что часть сценария может быть добавлена перед </head>
и что тот </head>
находится в начале новой строки
#!/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
У вас может быть синтаксическая ошибка, поскольку $page
не включен в кавычки, однако две основные причины этого заключаются в следующем:
- включить виртуальный путь, начинающийся с /, в вашем примере строка запроса должна быть /abc.html , а не abc.html
правило перезаписи также должно начинаться с пути, поэтому правило перезаписи должно быть
RewriteRule ^(.*)\.html /test.shtml?$1.html