CGI-скрипт представляет собой программу, запускаемую демоном httpd, выполняющую какие-то действия и возвращающую данные демону httpd для передачи их пользователю в броузер. CGI-скрипт является шлюзом ( как следует из названия Common Gateway Interface ), который во взаимодействии с такими прикладными системами, как СУБД, электронные таблицы, системы обработки графической информации и т.д. возвращает пользователю ответ на его запрос в виде HTML-страницы, GIF-картинки или другого средства представления информации.
CGI-скрипт ( в дальнейшем просто "скрипт"), на каком бы языке он не был написан, получает от демона httpd информацию тремя способами:
Возвращает скрипт эту информацию через стандартный вывод.
Вот список переменных окружения и их значения:
[an error occurred while processing this directive]
Переменные окружения , которые не зависят от типа запроса:
SERVER_SOFTWARE - показывает название и
версию http-сервера в формате: название/версия.
SERVER_NAME - показывает доменное имя сервера.
SERVER_ADDR - показывает IP сервера.
SERVER_ADMIN - e-mail администратора web-сервера.
GATEWAY_INTERFACE - версия CGI на момент компиляции httpd
демона в формате: CGI/версия
DATE_GMT - текущие дата и время во временой зоне GMT.
DATE_LOCAL - текщие дата и время во временной зоне сервера.
DOCUMENT_ROOT - путь к главному каталогу web-сервера.
Переменные окружения, которые зависят от типа запроса:
SERVER_PROTOCOL - протокол, по которому был
получен запрос.
SERVER_PORT - порт, на который был получен запрос.
REQUEST_METHOD - тип запроса: POST,GET и т.д..
REQUEST_URI - страница, отправившая запрос.
SCRIPT_NAME - URL скрипта без имени сервера.
SCRIPT_FILENAME - полное имя файла скрипта на диске.
QUERY_STRING - информация, содержащаяся в командной строке
вызова скрипта ( после ? в URL'е )
CONTENT_TYPE - MIME-тип данных, передаваемых скрипту.
CONTENT_LENGTH - длина передаваемых данных.
Переменные окружения, содержащие информацию о пользователе:
REMOTE_ADDR - IP пользователя.
REMOTE_PORT - порт, открытый на машине пользователя
броузером.
Переменные окружения, содержащие дополнительный параметры заголовка запроса:
Имя такой переменной формируется из "HTTP_"+имя заголовка. Причем все символы "-" (тире) в имени заголовка заменяются на символы "_" (подчеркивание). Примеры:
HTTP_ACCEPT - список MIME-типов, которые
клиент может обработать.
HTTP_USER_AGENT - в частном случае - броузер, который
использует пользователь.
HTTP_REFERER - URL страницы, с которой пришел на текущую
страницу пользователь.
При запросе по методу GET тело запроса передается в командную строку скрипта. Т.е. если запрашиваемый URL http://www.somesite.com/cgi-bin/somescript.cgi, то вызываться от будет так http://www.somesite.com/cgi-bin/somescript.cgi?тело_запроса. Все тело запроса передается в переменную окружения QUERY_STRING, тип данных запроса в CONTENT_TYPE, длина в CONTENT_LENGTH.
При запросе по методу POST тело запроса передается в стандартный поток ввода скрипта, тип данных запроса в CONTENT_TYPE, длина в CONTENT_LENGTH.
Независимо от метода запроса данные передаются в виде шестнадцатиричных символов типа "%2F"("/"), кроме печатаемых символов. Поэтому предварительно надо позаботиться о перекодировке в нормальные символы последовательности типа "Thanx%20for%20your%20help%21". А также заменить "+" на " ".
Cкрипт отправляет ответ на запрос на стандартный поток вывода. Этот ответ представляет собой либо данные сформированные скриптом, либо их местоположение. Вывод должен начинаться с заголовка, который состоит из следующих полей:
Затем, через пустую строку, состоящую только из символа переноса строки, следует тело ответа.
Скрипт можно вызвать разными способами. Самые распространенные из них:
Тэг FORM имеет следующий синтаксис:
<FORM ACTION="url"
METHOD="POST | GET" ENCTYPE="application/x-www-form-urlencoded">
<INPUT | SELECT | TEXTAREA.....>
....................
</FORM>
где url может быть URL'ом скрипта, командой "mailto:" и т.д. METHOD - тип запроса, ENCTYPE применяется только для METHOD="POST" и имеет только одно значение - application/x-www-form-urlencoded.
Тэг INPUT создает на форме поля ввода информации различного типа. Тэг имеет следующий синтаксис:
<INPUT TYPE="type" NAME="name" VALUE="value".....>
Тэг INPUT имеет следующие атрибуты:
Остальные атрибуты INPUT рассматриваться не будут. Они не столь важны для работы скрипта.
Тэг SELECT создает на форме выпадающее меню. Тэг имеет следующий синтаксис:
<SELECT NAME="name">
<OPTION> Option1
<OPTION> Option2
............
</SELECT>
Тэг SELECT имеет следующие атрибуты:
Тэг OPTION имеет следующие атрибуты:
Тэг TEXTAREA создает на форме поле ввода многострочного текста. Тэг имеет следующий синтаксис:
<TEXTAREA NAME="name" ROWS=количество_строк
COLS=количество_столбцов>
Тест, который будет содержать поле по умолчанию
</TEXTAREA>
Тэг TEXTAREA имеет следующие атрибуты:
Отправка содержания формы происходит при нажатии кнопки "submit". При отправке формы по методу GET, скрипт, указанный в атрибуте ACTION тэга FORM содержимое формы передается в командную строку скрипта после символа "?" в виде:
name1=value1&name2=value2&.......&nameN=valueN
где nameX - имя поля формы, а valueX - его значение. Для полей ввода текста или пароля значением будет их содержание, введенное пользователем или установленное по умолчанию, а для chekbox и radio значение, определенное в атрибуте VALUE, будет передано только для отмеченных кнопок. При METHOD="POST" строка формируется также, но передается в стандартный поток ввода.