Среда CGI
Давайте подойдем вплотную к рассмотрению вопроса о CGI-программировании. Прежде всего, для написания эффективно работающих CGI-скриптов необходимо правильно настроить Web-сервер. Потом, с полной уверенностью, можно смело начинать написание CGI-программ. Да, именно так - настроить Web-сервер. Ведь новичкам склонно считать, что стоит только поместить CGI-программу в их директорию (вместе с сайтом), скажем на том же narod.ru и их можно будет вызывать ;-)
Web-сервер
При слове сервер в голове невольно возникает образ мощного постоянно включенного компьютера величиной с книжный шкаф. Web-сервер это вовсе не просто кусок мощного железа! Прежде всего, это программа, которая принимает запросы от клиентов вроде GET index.html и выдает ответ. Либо в ответе будет действительно index.html, 404, еще какое-нибудь сообщение об ошибке, либо ..., да, в общем, что угодно! Эта программа может быть запущена как демон, т.е. работать постоянно, или просто, для экспериментов Web-мастера на локальной машине. Как видите, Web-серверу вовсе не обязательно быть подключенным к глобальной сети :-)) Он может работать через специальный IP-адрес 127.0.0.1, являющийся петлей, то есть отправленные пакеты приходят самому себе. При этом сервер корректно работает: выдает нужные файлы, запускает CGI-скрипты и т.п. Немного отступив от основной темы сайта, рассмотрим настройку Web-сервера Apache for Linux. Поставляется Apache в стандартном дистрибутиве любого Linux. Рекомендую Slackware Linux 7x. Все настройки Apache изменяются в файле /path/to/apache/conf/httpd.conf. Основное на данном этапе - описание директорий и корня сервера. Корень Web-сервера есть некий подкаталог файловой системы, от которого Web-сервер начинает отсчет доступных клиентам файлов. Если корнем сервера в файловой системе является /home/httpd/html/, следовательно, на запрос http://servername документ по умолчанию (index.html) будет взят из /home/httpd/html/index.html. Вот типичный пример секции описания корня Web-сервера в файле httpd.conf:
DocumentRoot "/home/httpd/html"
Дальше сразу следует описание директории-корня:
<Directory "/home/httpd/html"> Options Indexes FollowSymLinks Includes AllowOverride None Order allow,deny Allow from all </Directory>
где Options - дополнительные опции директории, Allow - позволяет блокировать доступ в эту директорию некоторым хостам, сразу всем или, как в примере - разрешить доступ со всех хостов. Такие же правила остаются и для описания других каталогов. Вообще в этом файле можно менять многие параметры работы сервера: нагрузку на сервер, описания виртуальных хостов, доступ в директории с авторизацией, страницы-сообщения об ошибках и еще уйму полезных вещей, которые будут обсуждаться позже.
cgi-bin
Обычно это название носит директория, из которой можно выполнять CGI-скрипты. Описывается по принципу описания обычной директории в файле httpd.conf. Небольшая особенность отличает ее от простой директории: в список опций добавляется директива ExecCGI, означающая разрешение на запуск программ из данной директории. Если директория cgi-bin находиться выше корня сервера в файловой системе, то используется ScriptAlias:
ScriptAlias /cgi-bin "/home/httpd/cgi-bin/" <Directory "/home/httpd/cgi-bin/"> AllowOverride None Options Indexes FollowSymLinks ExecCGI Order allow,deny Allow from all </Directory>
После того, как вы правильно описали директорию cgi-bin можно попробовать написать простейший CGI-скрипт, если Вы этого еще не сделали, и положить его в директорию cgi-bin в файловой системе. Проверьте права доступа на директорию cgi-bin и на сам CGI-скрипт. Необходимо, чтобы и директория и скрипт имели включенным право на исполнение от имени пользователя Web-сервера (обычно это nobody): rwxr-xr-x. Запустите Web-сервер (httpd) и вызовите скрипт из броузера http://servername/cgi-bin/first.cgi.
Переменные окружения
Из выше написанного можно сделать вывод, что CGI-скрипт представляет собой самую обычную программу, в которой мы имеем совокупность кода, HTML-тегов и обязательное взаимодействие с Web-сервером. Оказывается, что CGI-скрипты имеют доступ к т.н. переменным окружения сервера (environment variables), из которых можно извлекать весьма полезную информацию о пользователе, сервере и о соединении. Почти сразу возникает вопрос о том, как принять данные, отправленные по методу GET. Ответ на этот вопрос как раз кроется в ENV. Вы обращаетесь к переменным окружения так: $ENV{'KEYWORD'} - из Perl, или getenv("KEYWORD") - из C/C++, где KEYWORD какое-либо из ключевых слов:
GATEWAY_INTERFACE | Спецификация CGI |
SERVER_NAME | Имя сервера |
SERVER_ADMIN | Адрес e-mail администратора |
SERVER_SOFTWARE | Название и версия сервера |
SERVER_PROTOCOL | Версия протокола HTTP или HTTPS |
SERVER_PORT | Номер порта |
REQUEST_METHOD | Метод (GET или POST) |
PATH_INFO | Дополнительная информация скрипту (путь) |
SCRIPT_NAME | Имя скрипта |
SCRIPT_FILENAME | Полный путь к скрипту |
QUERY_STRING | Строка данных при методе GET |
REMOTE_HOST | Машина клиента |
REMOTE_ADDR | IP-адрес клиента |
AUTH_TYPE | Тип аутентификации |
REMOTE_USER | Имя пользователя |
CONTENT_TYPE | Кодировка данных из формы |
CONTENT_LENGTH | Размер присоединенных данных |
PATH_TRANSLATED | Конвертированная версия пути |
HTTP_USER_AGENT | Программа-броузер клиента |
HTTP_REFERER | ULR предыдущей страницы |
HTTP_PROXY_CONNECTION | Соединение через прокси |
HTTP_IF_MODIFIED_SINCE | Если документ был изменен |
HTTP_HOST | DNS имя хоста |
HTTP_FROM | Адрес электронной почты пользователя |
HTTP_COOKIE | Cookie броузера |
HTTP_CONNECTION | Тип установленной связи |
HTTP_ACCEPT | Перечень принимаемых mime-типов |
Самыми часто используемыми переменными среды являются QUERY_STRING и REMOTE_ADDR. Часто необходимо запретить повторное голосование или накрутку счетчика. Кроме переменных окружения есть еще полезные, а порой необходимые возможности среды CGI, требующие настройки. Они будут подробно рассмотрены в следующей статье...