Среда 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, требующие
настройки.
|