Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу).
Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). 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

Ссылки от спонсоров
    Фирме нужно купить готовый сервер или сервер на заказ в спб. | Новейший ленточный конвейер в России. | продажа квартир в новостройках подмосковья подробнее


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