Настройки сервера для работы с CGI-скриптами
Для исполнения CGI-скриптов сервер Apache должен быть соответствующим образом настроен. Во-первых, он должен быть собран с модулем исполнения CGI-скриптов (обычно включен по умолчанию), во-вторых, в файлах настройки сервера следует указать опции управления исполнением CGI-скриптов.
В данном разделе мы будем подразумевать, что сервер собран с модулем исполнения CGI-скриптов, поэтому обратимся сразу к настройкам сервера.
В версиях Apache, начиная с 1.2.6 можно все директивы настроек сервера включать в один файл httpd.conf. Однако традиционный способ настройки, который унаследован от NCSA-сервера, предполагает использование трех файлов настройки, которые отвечают за:
- настройку самого сервера (httpd.conf);
- настройку ресурсов Web-узла (srm.conf);
- настройку управления доступом к ресурсам (access.conf) .
Для виртуальных хостов все директивы размещаются в файле httpd.conf в разделах описания каждого из виртуальных хостов.
httpd.conf
В этом файле определяются скрипты обработки нестандартных методов доступа (PUT или DELETE), а также описания работы с CGI-скриптами для виртуальных хостов.
Для указания скрипта обработки нестандартного метода используют директиву Script:
Script PUT put_script.cgi
Вместо PUT здесь можно указать DELETE или другой метод доступа. При обращении по данному методу доступа будет вызван скрипт, который указан в качестве второго аргумента.
Директивы для описания работы со скриптами для виртуальных хостов размещают внутри контейнера VirtualHost:
<VirtualHost>
...
</VirtualHost>
Внутрь этого контейнера можно помещать все директивы, которые размещают для основного сервера в файлах httpd.conf, srm.conf, access.conf.
srm.conf
В этом файле определяется конфигурация ресурсов, которыми управляет сервер. Скрипты входят в состав этих ресурсов. Каталог скриптов по умолчанию определяет директива ScriptAlias:
ScriptAlias cgi-bin /usr/local/etc/httpd/cgi-bin
В данном каталоге определяется синоним части URL (первый параметр директивы), которому ставится в соответствие реальный путь в каталоге файловой системы вычислительной установки, где эксплуатируется сервер (второй аргумент). Например:
http://server.intuit.ru/cgi-bin/test.cgi
обращается к файлу
/usr/local/etc/httpd/cgi-bin/test.cgi
Кроме стандартного места размещения скриптов, которое определяется через ScriptAlias, скрипты можно хранить в произвольном каталоге, внутри дерева каталогов сервера.
Дерево каталогов сервера определяется директивой DocumentRoot:
DocumentRoot /www/host.ru/htdocs
или
DocumentRoot htdocs
В первом случае указан полный путь, от корня файловой системы, а во втором — относительный путь, т.е. путь от домашнего каталога сервера.
Для того, чтобы можно было запускать скрипты, нужно добавить handler (обработчик) для запуска скриптов из заданного каталога:
SetHandler cgi-script
Кроме того, с расширением файла можно связать MIME-тип, по которому сервер распознает скрипт:
AddType application/x-www-form-urlencoded .pl
В данном случае мы назначаем расширение *.pl для CGI-скриптов. Традиционным расширением скриптов по умолчанию является расширение *.cgi.
access.conf
Наиболее важной директивой в этом файле с точки зрения исполнения скриптов является Options. Она используется внутри контейнера Directory:
<Directory /usr/local/etc/httpd/htdocs>
Options ExecCGI
</Directory>
В данном случае для каталога /usr/local/etc/httpd/htdocs будет разрешено исполнение CGI-скриптов.
Скрипты для обработки нестандартных методов доступа
Для того, чтобы обработать метод доступа, отличный от GET или POST, необходимо выполнить несколько условий: подготовить скрипт для обработки данного метода, настроить сервер и определить соответствующие права доступа к каталогам, с которыми этот скрипт будет работать. Рассмотрим как это делается на примере обработки запроса по методу PUT.
Некоторые серверы, например IIS компании Microsoft, имеют встроенные модули для работы с методом PUT. Сервер Apache такого модуля в стандартной комплектации не имеет, но позволяет подключить скрипт для обработки запросов по методу PUT.
Сама программа обработки таких запросов может выглядеть следующим образом:
#!/usr/local/bin/perl
if($ENV{REQUEST_METHOD} ne "PUT")
{
die "Content-type: text/plain\n\nМетод доступа не PUT";
}
$fname=$ENV{PATH_TRANSLATED};
if(!$fname)
{
die "Content-type: text/plain\n\nНе указана мишень вывода";
}
$length=$ENV{CONTENT_LENGTH};
if(!$length)
{
die "Content-type: text/plain\n\nСтраница имеет нулевой размер";
}
read(STDIN,$page,$length);
open(OUT,">$fname");
print OUT $page;
close(OUT);
print "Content-type: text/plain\n\nДанные получены.";
Первый оператор if проверяет метод доступа, второй — адрес страницы, которую следует разместить, третий — наличие самих данных для размещения по адресу страницы. Проверок для полной уверенности в передаче данных на самом деле нужно выполнить несколько больше. Кроме того, требуется сгенерировать код возврата и запись в журнал посещений, чтобы этот пример стал реально действующей программой.
Теперь нужно настроить сервер. Для этого в файле конфигурации сервера httpd.conf следует указать:
Script PUT cgi-сценарий
Здесь cgi-сценарий — это имя нашего скрипта.
После этого для нашего сценария, а, точнее, для пользователя, от которого он запускается, нужно разрешить запись данных в каталог размещения страниц и, если это необходимо, внести изменения в файлы настройки процедуры аутентификации.
Скрипты и Server Site Includes
Стандартный модуль подстановок (includes) сервера Apache позволяет задействовать CGI-скрипты для генерации подстановок. Скрипт, в отличие от обычной программы, наследует переменные окружения, которые генерирует сервер для CGI-скриптов, а не стандартный набор переменных окружения оболочки (shell).
Для вставки внутрь документа результатов работы скрипта используется директива:
<!--#exec cgi="/cgi-bin/include.cgi" -->
В данном случае мы вставили в документ результат работы скрипта include.cgi.
Вставку можно использовать и не для генерации части текста документа, а для анализа данных, передаваемых в страницу или для анализа переменных окружения CGI-скрипта, т.е. условий обращения к странице. Например, для анализа IP-адреса пользователя и условного перенаправления запроса.
Для того, чтобы сервер выполнил подстановки в файл srm.conf, нужно внести строку определения типа документов, подлежащих разбору (server parsed documents):
AddType text/x-server-parsed-html .shtml
Расширение файла *.shtml обычно используется для документов, требующих анализа их содержания на предмет выполнения подстановок. Если администратор желает распространить предварительный анализ содержания документов на все документы, то вместо или в дополнение к .shtml можно указать и .html.
Кроме того, для каталога (файл access.conf — общий файл конфигурации доступа или .htaccess — файл конфигурации доступа, расположенный в данном каталоге и переопределяющий правила доступа), в котором расположены документы в директиве Options, должны быть разрешены и подстановки, и исполнение CGI-скриптов:
<Directory /usr/local/etc/httpd/htdocs>
AllowOverride
Options Includes ExecCGI
</Directory>
В данном случае для домашнего каталога документов сервера Apache, который используется в настройках по умолчанию, разрешено переопределять опции доступа в подкаталогах (AllowOverride) и исполнять подстановки и скрипты (Options Includes ExecCGI). По умолчанию обычно используют вместо последних двух опций одну — All. Она тоже разрешает подстановки и выполнение скриптов, а также ряд других действий:
<Directory /usr/local/etc/httpd/htdocs>
AllowOverride
Options All
</Directory>
Вообще говоря, существует возможность разрешить подстановки, но запретить выполнение скриптов:
<Directory /usr/local/etc/httpd/htdocs>
AllowOverride
Options IncludesNoExec
</Directory>
В этом случае отключаются не только скрипты, но и обычные команды, выполняемые из стандартной оболочки (shell). При этом можно разрешить исполнение скриптов самих по себе, но не в качестве вставок.
<Directory /usr/local/etc/httpd/htdocs>
AllowOverride
Options IncludesNoExec ExecCGI
</Directory>
В данной конфигурации исполнение скриптов разрешено, а выполнение подстановки по команде exec запрещено.
|