Как заставить Apache изменять статические веб-страницы "на лету"

StackOverflow https://stackoverflow.com/questions/40133

Вопрос

Я экспериментировал с 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
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top