Web-сервер Apache: добавление HTML на лету


Вопрос о том, как добавить некий фрагмент HTML-кода к существующим статическим HTML-файлам «на лету» (не модифицируя сами файлы), встречается на форумах так часто, что я решил раскатать здесь об одном, самом простом и доступном, способе.
Задача

Итак, пусть мы имеем набор HTML-файлов вида:

<html>
<body>
<h1>ok</h1>
</body>
</html>

Нам необходимо, выдавая их клиентам, автоматически добавлять после <body> код:

<p>добавленный код</p>

(видимо это некий код, содержащий баннер или рекламу).

Решение

Настройка Web-сервера Apache

Всё, что нам понадобится, это директива Action. Она ассоциирует некий CGI-скрипт с заданным MIME-типом (или PHP-скрипт, или скрипт любой другой природы). Например так:

Action text/html /cgi-bin/translate.cgi

Эту директиву можно использовать где угодно: в основном конфигурационном файле httpd.conf или в локальном .htaccess.

Теперь, при обращение к файлу, имеющему MIME-тип text/html будет вызываться скрипт /cgi-bin/translate.cgi (естественно, только в области действия директивы Action).

Скрипт-обработчик

Приведу пример на Perl, хотя эти действия могут быть произведены на любом языке:

#!/usr/bin/perl
# выдаём заголовок
print "Content-Type: text/html\n\n";
# получаем имя запрашиваемого файла
# из переменной окружения PATH_TRANSLATED
my $file=$ENV{‘PATH_TRANSLATED’};
# считываем весь файл
open F, "<$file" or die;
my $content=join('', <F>);
close F;
# производим все необходимые замены
$content=~s{<body>}{<body><p>добавленный код</p>};
# выдаём преобразованный файл клиенту
print $content;

Как видите, полный путь к файлу, который запросил пользователь, передаётся в переменной окружения PATH_TRANSLATED. Скрипт читает, модифицирует и выдаёт этот файл вот в таком виде:

<html>
<body><p>добавленный код</p>
<h1>ok</h1>
</body>
</html>

Обратите внимание, что данный скрипт написан весьма схематично. В реальной жизни, конечно, следует проверять имя запрашиваемого файла (не пытается ли злоумышленник выудить у вас секретную информацию).

Кроме того, замену я сделал очень просто, мой скрипт не справится с тегом:

<body bgcolor="#999999">

Но, я думаю, усовершенствование этого скрипта для вас не будет проблемой. Единственное, на что следует обратить внимание, это на обработку ситуации, когда модификацию документа не удалось выполнить. Возможно, при этом вы захотите выдавать не сам документ, а, например, сообщение о том, что формат запрошенного файла не верен.


Комментарии запрещены.




Статистика