Получение Apache для изменения статических веб-страниц на лету - PullRequest
2 голосов
/ 02 сентября 2008

Я экспериментировал с woopra.com Инструментом веб-аналитики. Что требует, чтобы часть кода JavaScript была добавлена ​​на каждую страницу, чтобы функционировать. Это достаточно просто для более динамичных сайтов с универсальными колонтитулами, но не для полностью статичных html-страниц.

Я попытался обойти его, используя комбинацию переписывания Apache и 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, которые могли бы сделать то же самое. Предпочтительно это может быть настроено для каждого сайта.

Спасибо

Peter

Ответы [ 4 ]

2 голосов
/ 02 сентября 2008

Я думаю, что mod_filter_ext - это модуль, который вы ищете. Например, вы можете написать короткий Perl-скрипт для вставки кода JS в страницы и регистрации его для обработки HTML-страниц:

while (<>) {
    s/<html>/\Q<script>....\E/;
    print $_;
}

Вы можете даже использовать что-то вроде sed для выполнения замены.

1 голос
/ 02 сентября 2008

Если страницы статичны, почему бы вам изменить их на лету, вместо предварительной обработки всех страниц сайта, добавив часть требуемого JavaScript к каждой из них? Это просто и, вероятно, более эффективно (у вас больше просмотров страниц, чем страниц, которые нужно изменить)

Это может быть сделано многими способами. Я бы предложил небольшой Perl для встроенной замены.

0 голосов
/ 29 июля 2009

У вас может быть синтаксическая ошибка, так как $page не включен в кавычки, однако две основные причины, по которым это не так:

  • включает виртуальный, если путь начинается с /, в вашем примере строка запроса должна быть /abc.html, а не abc.html
  • правило перезаписи также должно начинаться с пути, поэтому правило перезаписи должно быть

    RewriteRule ^(.*)\.html /test.shtml?$1.html
    
0 голосов
/ 29 января 2009

хорошо, самая большая проблема, описанная выше, заключается в том, что он нарушит вашу валидность html, поместив тег скрипта вне тегов <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
...