Давайте подойдем вплотную к
рассмотрению вопроса о 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, требующие
настройки. Они будут подробно
рассмотрены в следующей статье...
|