![]() |
![]() |
|
||
![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||||
| [6 ноября 2001 г.] |
|
Где начало того конца, которым оканчивается начало? А действительно, где?.. |
В следующей набле рассмотрим первую часть фразы. А пока начнем с конца. То есть, с последней фразы об Apache.
Вообще говоря, она не совсем верна. Разработчики Apache вовсе не любят своих пользователей. Временами создается впечатление, что они просто о них и не подозревают. Некоторое время назад, участвуя в создании молодой хостинг-компании, я выяснил забавную вещь: «Разработчики Apache не предполагали, что сервером будут пользоваться для предоставления услуг хостинга». Не правда ли, странно? Впрочем, как-нибудь мы поговорим и об этом тоже.
|
Сервер Apache знаменит своими выдающимися возможностями конфигурирования. При этом рядовой пользователь (не администратор) может настроить себе практически все, что угодно: квартиру, горячую воду, отопление... Нас сейчас будет интересовать одна возможность: перехват обращений ко всем страницам сайта с помощью специально написанного «скрипта-бога».
Почему скрипт сравнивается с богом? Да потому, что он примерно так же вездесущ, хоть и в пределах одного сайта.
|
Для следующих экспериментов нам понадобится отдельный пустой сервер. Впрочем, если вы подумали о выделенном канале и отдельной машине у провайдера, ущипните себя. Больно?.. При известной сноровке можно обойтись и заурядным «заполненным» виртуальным хостом, манипулируя с директориями. В этом случае
Aktion perl "/_Kernel/Scriptor.pl" AddHundler perl .htm
То есть, нет, простите, вот такой:
Action perl "/_Kernel/Scriptor.pl" AddHandler perl .htm
А произойдет вот что: при наборе в браузере адреса какой-либо страницы с расширением htm (http://dklab.ru/test.htm) клиенту на самом деле перешлется не она, а нечто другое. В нашем
Первая строчка обозначает, что адрес /_Kernel/Scriptor.pl теперь имеет синоним (вернее, имя обработчика) perl. Можно было бы использовать и другое слово вместо perl, например, nakosikasukasena. Вторая строка говорит Apache о том, что адреса всех страниц с расширением htm (например, /test/abc.htm) нужно преобразовывать в такой вид: /_Kernel/Scriptor.pl/test/abc.htm. Далее, увидев этот адрес, Apache с удивлением обнаруживает, что Scriptor.pl имя скрипта, а не директории, и запускает программу. А «хвост» передается через переменные окружения. |
К сожалению, Apache версии 1.3 устроен таким образом, что один документ может быть передан на обработку лишь одному обработчику. Никакой «конвейерной обработки» не предусмотрено.
Позвольте, почему же скрипт находится не в /cgi-bin/, а в какой-то непонятной директории /_Kernel/? А это потому, что многие хостинг-провайдеры теперь взяли моду назвать директории для CGI не /cgi-bin/, а как-нибудь по-другому. В результате пользователь начинает лихорадочно соображать, что же надо изменить, чтобы все начало работать. |
Как же устроен вездесущий скрипт /_Kernel/Scriptor.pl? А вот так:
#!/usr/local/bin/perl -w
use FindBin qw($Bin); # текущая директория в $Bin
use Apache::Scriptor::Simple("$Bin/handlers");
Можно опять видеть, что вся основная логика сосредоточена в подключаемом модуле с длинным
До сих пор мы использовали лишь один обработчик с именем perl, так что полезность системы оставалось весьма сомнительной. Попробуем добавить второй обработчик в конвейер. Пусть результат работы обработчика perl передается на вход обработчику s_copyright, который будет добавлять в начало документа строку HTML-комментариев с текстом об авторских правах. Для этого нам нужно, во-первых, написать сам обработчик. Это очень просто:
sub s_copyright
{ my ($input)=@_;
print '<'.'!-- Copyright (C) by Dmitry Koteroff';
print '(E-mail) -->\n'.$input;
# 0 означает OK. Возвращайте -1, если хотите,
# чтобы возникла 404-я ошибка.
return 0;
}
Теперь нужно сохранить этот обработчик в таком файле, чтобы Apache::Scriptor::Simple смог его найти. Такое место мы указываем сами при подключении
Далее, необходимо указать, какие обработчики входят в конвейер. Для этого модифицируем наш файл .htaccess:
Action perl "/_Kernel/Scriptor.pl" AddHandler perl .htm Action s_copyright "/_Kernel/Scriptor.pl" AddHandler s_copyright .htm
Вообще говоря, для |
Так как расширение htm связано сразу в двумя обработчиками (это только так кажется, Apache все равно будет использовать лишь последнее определение), они образуют с точки зрения Apache::Scriptor::Simple конвейер: файл => perl => s_copyright => браузер.
Модуль отличает «свои» обработчики от «чужих» (которые также могут присутствовать в файле .htaccess, если вы, например, пользуетесь другим скриптом перехвата для некоторых расширений). Он может это сделать, так как видит, что указано во втором параметре Action, и знает свой собственный URL. Еще подсказки нужны?..
|
Наконец, напишем и запустим через браузер такой файл с именем /test.htm:
# Ну и ну... print "Hello, world!";
Что же выведется в окне браузера? А черт знает что, потому что мы забыли сказать Apache: /_Kernel/Scriptor.pl является скриптом. Помните? Ну так сделаем это прямо сейчас, записав в файл /_Kernel/.htaccess такой код:
Options ExecCGI # можно запускать скрипты AddHandler cgi-script .pl # pl - это скрипт deny from all # запретить доступ к этой директории <Files "Scriptor.pl"> # разрешить доступ allow from all # только для Scriptor.pl </Files>
|
Да-да, конечно: нужно еще установить модуль Apache::Scriptor::Simple. Это можно сделать в соответствии с рекомендациями, изложенными в избитой сапогами посетителей пятой набле. Лежат сами модули, как обычно, по адресу
http://dklab.ru/chicken/mod/cpan (для Unix), или
http://dklab.ru/chicken/mod/ppd (для Windows). И тут вы столкнетесь с одним нюансом: оказывается, Apache::Scriptor::
Да, и еще не забудьте про модуль CGI::WebOut, который описан в четвертой набле (он также используется системой, куда же без него нам, горемычным...)
На всякий случай привожу полную опись файлов.
Файл /.htaccess:
Action perl "/_Kernel/Scriptor.pl" AddHandler perl .htm Action s_copyright "/_Kernel/Scriptor.pl" AddHandler s_copyright .htm
Файл /test.htm:
print "Hello world";
Файл /_Kernel/Scriptor.pl:
#!/usr/local/bin/perl -w
use FindBin qw($Bin);
use Apache::Scriptor::Simple("$Bin/handlers");
Файл /_Kernel/.htaccess:
Options ExecCGI # можно запускать скрипты AddHandler cgi-script .pl # pl - это скрипт deny from all # запретить доступ к этой директории <Files "Scriptor.pl"> # разрешить доступ allow from all # только для Scriptor.pl </Files>
Файл /_Kernel/handlers/s_copyright.pl:
sub s_copyright
{ my ($input)=@_;
print '<'.'!-- Copyright (C) by Dmitry Koteroff';
print '(E-mail) -->\n'.$input;
# 0 означает OK. Возвращайте -1, если хотите,
# чтобы возникла 404-я ошибка.
return 0;
}
Возможности модулей на этом не ограничиваются. С помощью них можно делать еще одну полезную вещь: перехватывать запросы к несуществующим файлам. Желающие могут почитать об этом во встроенной в модули документации.
|
![]() |
| ||||||||||||||||||||||||
| Дмитрий Котеров | 6 ноября 2001 г. ©1999-2010 | | Контакт | Вернуться к оглавлению |