• SSI (Server Side Includes — включаемые средства на стороне сервера) также предназначены для динамической генерации содержимого документа, но, в отличие от CGI-сценариев, которые формируют всю Web-страницу, SSI лишь изменяют шаблоны. SSI не обеспечивают такой гибкости, как CGI, но их удобно использовать для внесения небольших изменений в состав статических Web-страниц, например, для включения информации о текущей дате.
Существуют также другие средства динамической генерации содержимого Web-страниц. Например, в настоящее время в распоряжение разработчика предоставляются многочисленные инструменты, которые можно успешно использовать вместо CGI, но CGI-сценарии до сих пор остаются самым популярным средством решения подобных задач. Заметьте, что Web-страницы, генерируемые CGI-сценариями, могут содержать
формы ввода. Эти два инструмента не исключают друг друга. Напротив, данные, обрабатываемые CGI-сценариями, чаще всего вводятся посредством форм.
Поддержка CGI-сценариев
Если вы собираетесь использовать CGI-сценарии, то должны сообщить серверу Apache о своем намерении. При получении URL, содержащего имя сценария, сервер должен запустить этот сценарий, а также организовать обработку данных, переданных клиентом, формирование Web-страницы и передачу ее броузеру. При использовании CGI-сценария Apache выполняет роль посредника между клиентом и сценарием на стороне сервера. Настроить сервер для выполнения подобных функций не сложно. Вы должны лишь разрешить поддержку CGI-сценариев и сообщить Apache типы запросов, при получении которых следует запускать сценарии.
Для обеспечения работы с CGI необходимо загрузить соответствующий модуль Apache.
LoadModule cgi_module lib/apache/mod_cgi.so
Если компоненты, предназначенные для поддержки CGI-сценариев, включены в состав двоичных файлов Apache, вам надо активизировать их посредством директивы
AddModule
. (В некоторых случаях активизировать надо и компоненты, реализованные в виде модулей.)
AddModule mod_cgi.с
В результате сервер Apache получает возможность запускать CGI-сценарии и взаимодействовать с ними. Вам осталось лишь разрешить поддержку CGI для конкретных файлов и каталогов. Сделать это можно несколькими способами.
•
ScriptAlias
. Данная директива решает две задачи. Во-первых, она сообщает серверу Apache о том, что файлы, содержащиеся в указанном каталоге, должны интерпретироваться как CGI-сценарии. Во-вторых, посредством этой директивы задается соответствие между каталогом, расположенным на диске, и каталогом, который указывается в URL. Например, выражение
ScriptAlias /scripts/ "/home/httpd/cgi-bin/"
отображает физический каталог
/home/httpd/cgi-bin/
в каталог
/scripts
в составе URL. В результате, если пользователь укажет URL
http://www.threeroomco.com/scripts/test.pl
, сервер запустит на выполнение сценарий
test.pl
, содержащийся в каталоге
/home/httpd/cgi-bin/
. Часто при инсталляции Apache опции
LoadModule
и
AddModule
по умолчанию включаются в конфигурационный файл; вероятнее всего, вы встретите их, просматривая содержимое файла
httpd.conf
. Для работы с CGI-сценариями часто бывает нужен модуль
mod_alias
. Соответствующая директива обычно по умолчанию включается в состав конфигурационного файла. При возникновении проблем, проверьте, загружен ли данный модуль.
•
Options +ExecCGI
. Разрешить выполнение CGI-сценариев можно, указав значение
+ExecCGI
директивы Options. Данная опция не должна указываться для всей системы, ее имеет смысл применять только к отдельным каталогам (т.е. она должна присутствовать только в составе директивы
<Directory
>).
•
.htaccess
. Контролировать доступ к отдельному каталогу можно, размещая в нем файл
.htaccess
. Если в файле
.htaccess
содержится запись
Options +ExecCGI
, Apache будет запускать CGI-сценарии, находящиеся в этом каталоге. Чтобы это произошло, в файле
httpd.con
f должна находиться запись
AllowOverride Options
; эта запись должна воздействовать как минимум на каталог, содержащий файл
.htaccess
.
Внимание
Наличие
записей
Options +ExecCGI
и
AllowOverride Options
представляет угрозу для системы. При неправильном использовании этих средств пользователи получают возможность создавать сценарии, предоставляющие полный доступ к системе. По этой причине в большинстве дистрибутивных пакетов использование файла
.htaccess
запрещено.
Часто при настройке Apache в конфигурационный файл включается директива
ScriptAlias
, отображающая каталог
/home/httpd/cgi-bin
файловой системы в каталог
/cgi-bin
в составе URL. Такая настройка удобна для администратора. Чтобы установить CGI-сценарий и сделать его доступным для пользователя, достаточно разместить соответствующий файл в каталоге
/home/httpd/cgi-bin
. При этом необходимо обратить внимание на права доступа к файлу. Поскольку сценарий предназначен для выполнения, для файла, содержащего код этого сценария, должен быть установлен соответствующий признак. Если вы написали сценарий самостоятельно или скопировали его с Web- или FTP-узла, то после размещения его в каталоге
/home/httpd/cgi-bin
надо выполнить команду
chmod a+x имя_сценария
.
Создание CGI-сценариев
Подобно другим сценариям, CGI-сценарии представляют собой программный код, предназначенный для выполнения. Данная глава не является руководством по написанию CGI-сценариев; в этом разделе приведены лишь некоторые общие рекомендации по работе с ними. Если вам потребуется дополнительная информация о создании CGI-сценариев, обратитесь к Web-странице по адресу
http://httpd.apache.org/docs/howto/cgi.html
либо к одной из книг, посвященных этой теме.
CGI-сценарии принимают входные данные через стандартный ввод и выводят сгенерированную Web-страницу через стандартный вывод. Вывод текста, который должен быть передан клиенту, ничем не отличается от обычного вывода на консоль. Необходимо лишь помнить, что клиент просматривает информацию посредством Web-броузера, поэтому ваш CGI-сценарий должен генерировать информацию в формате HTML либо в другом формате, поддерживаемом Web-клиентом. (Например, вы можете сформировать ответ в виде графического файла.)
Помимо HTML-кода, CGI-сценарий должен создать поле заголовка
Content-Type
и в качестве его значения указать MIME-тип данных, передаваемых клиенту. Это поле имеет следующий вид:
Content-type: text/html\r\n\r\n
В данном примере указан MIME-тип
text/html
, означающий, что в ответ на запрос клиента CGI-сценарий сгенерировал HTML-документ. Символы
\r\n\r\n
соответствуют двум переводам строки, в результате поле заголовка будет отделено от остальных данных пустой строкой. Код сценария зависит от используемого вами языка программирования. Простейший пример CGI-сценария, написанного на языке Perl, приведен в листинге 20.1. Как видно из листинга, в процессе выполнения сценарий выводит строку текста. Записав файл с этим кодом в каталог, предназначенный для размещения CGI-сценариев, установите права доступа. Если после этого вы зададите URL сценария в поле адреса броузера, то увидите строку "Hello, Web".
Листинг 20.1. Простой CGI-сценарий, написанный на языке Perl
#!/usr/bin/perl
print "Content-type: text/html\r\n\r\n";
print "Hello, Web";
С обработкой входных данных дело обстоит несколько сложнее. Ваш сценарий получит данные только в том случае, если они были введены пользователем посредством интерактивных элементов, содержащихся в форме. Данные поступают на вход сценария в виде набора пар имя-значение. Имя отделяется от значения символом
=
, а пары имя-значение разделяются символами
&
. Пример строки параметров, передаваемой CGI-сценарию, приведен ниже.