Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу).
Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Homepage Карта сайта Версия для печати

Джентльменский набор Web-разработчика   Ларри Уолл о Perl6   Наблы Система Orphus
 

8. Внедрения HTML в код на Perl (первый шаг),  а также о том, как разработчики Apache любят своих пользователей

[6 ноября 2001 г.]

  Где начало того конца, которым оканчивается начало?
А действительно, где?..

В следующей набле рассмотрим первую часть фразы. А пока начнем с конца. То есть, с последней фразы об Apache.

Лирическое отступление 
Вообще говоря, она не совсем верна. Разработчики Apache вовсе не любят своих пользователей. Временами создается впечатление, что они просто о них и не подозревают. Некоторое время назад, участвуя в создании молодой хостинг-компании, я выяснил забавную вещь: «Разработчики Apache не предполагали, что сервером будут пользоваться для предоставления услуг хостинга». Не правда ли, странно? Впрочем, как-нибудь мы поговорим и об этом тоже.

Сервер Apache знаменит своими выдающимися возможностями конфигурирования. При этом рядовой пользователь (не администратор) может настроить себе практически все, что угодно: квартиру, горячую воду, отопление... Нас сейчас будет интересовать одна возможность: перехват обращений ко всем страницам сайта с помощью специально написанного «скрипта-бога».

Лирическое отступление 
Почему скрипт сравнивается с богом? Да потому, что он примерно так же вездесущ, хоть и в пределах одного сайта.

Для следующих экспериментов нам понадобится отдельный пустой сервер. Впрочем, если вы подумали о выделенном канале и отдельной машине у провайдера, ущипните себя. Больно?.. При известной сноровке можно обойтись и заурядным «заполненным» виртуальным хостом, манипулируя с директориями. В этом случае главное — не запутаться в них. Итак, что будет, если создать в директории документов сервера (DOCUMENT_ROOT, как его называют те, кто хочет сэкономить время и слюну) такой файл с именем .htaccess:

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.

Чайник 

Первая строчка обозначает, что адрес /_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");

Можно опять видеть, что вся основная логика сосредоточена в подключаемом модуле с длинным названием — Apache::Scriptor::Simple. Как было ранее замечено, Apache не поддерживает конвейерную обработку документов. Зато ее поддерживает Apache::Scriptor::Simple, и вот каким образом.

  1. Пользователь набирает в браузере адрес страницы.
  2. Запрос перехватывается скриптом Scriptor.pl, а значит, и модулем Apache::Scriptor::Simple.
  3. Модуль смотрит, что написано в файле .htaccess. Он обращает внимание, как называется обработчик для расширения документа. В нашем случае — это perl (или edepietamblue, если вы большой оригинал).
  4. Модуль ищет функцию-обработчик для документа с нужным именем. Если ее нет среди «встроенных», в директории handlers происходит поиск файла обработчик.pl, и код функции берется оттуда. В нашем случае обработчик perl является встроенным.
  5. Модуль запускает функцию-обработчик, передавая ей в параметрах содержимое документа. Она должна напечатать результат при помощи print или других средств.
  6. Если в конвейере есть и другие обработчики, выходной поток предыдущего обработчика подается на вход следующего.

До сих пор мы использовали лишь один обработчик с именем 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 смог его найти. Такое место мы указываем сами при подключении модуля — это handlers, расположенная в той же директории, что и сам Scriptor.pl. Итак, записываем файл под именем /_Kernel/handlers/s_copyright.pl.

Далее, необходимо указать, какие обработчики входят в конвейер. Для этого модифицируем наш файл .htaccess:

Action     perl "/_Kernel/Scriptor.pl"
AddHandler perl .htm
Action     s_copyright "/_Kernel/Scriptor.pl"
AddHandler s_copyright .htm

Чайник 

Вообще говоря, для Apache — это повтор, одно и то же. Вообще говоря, для Apache — это повтор, одно и то же. Да. Да. Но не для Apache::Scriptor::Simple. Но не для Apache::Scriptor::Simple.

Так как расширение 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::Simple — лишь оболочка для более универсального модуля, носящего имя 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 месяцев. Печальный опыт «расползания» чрезвычайно устаревших ошибочных версий статьи про Apache действительно объясняет такое решение.

Орфография на «Куроводстве»:
    если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Выделенный текст будет немедленно отослан вебмастеру, а Вы даже ничего и не заметите — настолько быстро все произойдет.

На заметку:
    если вы уже вскипели насчет дизайна этой страницы, то присмотритесь повнимательнее к названию, почитайте FAQ, сходите по лебедевским местам, как это уже предлагалось выше. Можно ли считать пародию плагиатом? Надеюсь, что нет.

Параметры этой страницы
   
GZip

Ссылки от спонсоров
    Установка счетчиков воды недорого в Москве http://www.voduberegi.ru/.


Дмитрий Котеров | 6 ноября 2001 г. ©1999-2016 | Генеральный спонсор: Хостинг «Джино» | Контакт Вернуться к оглавлению