Информация о CGI
Информация о CGI.
CGI-скрипт представляет собой программу, запускаемую
демоном http2d, выполняющую какие-то действия и возвращающую данные демону
http2d для передачи их пользователю в броузер. CGI-скрипт является шлюзом
( как следует из названия Common Gateway Interface ), который во
взаимодействии с такими прикладными системами, как СУБД, электронные таблицы,
системы обработки графической информации и т.д. возвращает пользователю
ответ на его запрос в виде HTML-страницы, GIF-картинки или другого средства
представления информации.
CGI-скрипт ( в дальнейшем я буду просто писать "скрипт",
лень постоянно на английский переключаться....:)), на каком бы языке он
не был написан, получает от демона http2d информацию тремя способами:
- Через переменные окружения.
- Через командную строку.
- Через стандартный ввод.
Возвращает скрипт эту информацию через стандартный вывод.
Переменные окружения
Вот список переменных окружения и их значения:
DATE_GMT = Saturday, 30-Sep-2000 17:15:51 GMT
DATE_LOCAL = Saturday, 30-Sep-2000 21:15:51 MSD
DOCUMENT_NAME = cgi.shtml
DOCUMENT_PATH_INFO =
DOCUMENT_ROOT = /home/http2d/public_html
DOCUMENT_URI = /article/cgi.shtml
GATEWAY_INTERFACE = CGI/1.1
HTTP_ACCEPT = */*
HTTP_ACCEPT_LANGUAGE = ru
HTTP_CACHE_CONTROL = max-age=259200
HTTP_CONNECTION = keep-alive
HTTP_COOKIE = bbpassword=cd58ca0b; bbuserid=1; bblastactivity=967676557; bblastvisit=967674715; golos=969260129; admin=bmFzOmFudHJhY2l0; b=b; one=2; 69ab827b0e71a6e39e8fdbbd781d3cfe=phRC8rO2zwi32
HTTP_HOST = webscript.ru
HTTP_REFERER = //webscript.ru/docum.shtml
HTTP_USER_AGENT = Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
HTTP_VIA = 1.0 gw.ultra.net.ru:3128 (Squid/2.3.STABLE3), 1.0 smsserv.smslan.net:3128 (Squid/2.2.STABLE4), 1.0 squid.iitp.ru:3128 (Squid/2.2.STABLE5)
HTTP_X_FORWARDED_FOR = 10.5.9.5, 194.67.181.2, 195.19.74.19
LAST_MODIFIED = Wednesday, 13-Sep-2000 11:34:59 MSD
PATH = /bin:/usr/bin:/usr/local/bin
PATH_INFO = /env.pl
PATH_TRANSLATED = /home/w/webs/public_html/env.pl
QUERY_STRING =
REMOTE_ADDR = 195.19.74.137
REMOTE_PORT = 3575
REQUEST_METHOD = GET
REQUEST_URI = /article/cgi.shtml
SCRIPT_FILENAME = /home/http2d/cgi-bin/sbox
SCRIPT_NAME = /cgi-bin/env.pl/env.pl
SCRIPT_URI = //webscript.ru/article/cgi.shtml
SCRIPT_URL = /article/cgi.shtml
SERVER_ADMIN = daniel@bsn.ru
SERVER_NAME = webscript.ru
SERVER_PORT = 80
SERVER_PROTOCOL = INCLUDED
SERVER_SOFTWARE = Apache/1.3.9 (Unix) (Red Hat/Linux) PHP/3.0.14
USER_NAME = webs
Переменные окружения , которые не зависят от типа
запроса:
SERVER_SOFTWARE - показывает название и версию http2-сервера
в формате: название/версия.
SERVER_NAME - показывает доменное имя сервера.
SERVER_ADDR - показывает IP сервера.
SERVER_ADMIN - e-mail администратора web-сервера.
GATEWAY_INTERFACE - версия CGI на момент компиляции http2d демона
в формате: 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 пользователя.( На hosting.agava.ru,
на котором находится моя страница, REMOTE_ADDR всегда равен IP hosting.agava.ru.
Это не правильно, но это не мои проблемы...:) )
REMOTE_PORT - порт, открытый на машине пользователя броузером.
Переменные окружения, содержащие дополнительный параметры
заголовка запроса:
Имя такой переменной формируется из "HTTP_"+имя
заголовка. Причем все символы "-" (тире) в имени заголовка заменяются
на символы "_" (подчеркивание). Примеры:
HTTP_ACCEPT - список MIME-типов, которые клиент может
обработать.
HTTP_USER_AGENT - в частном случае - броузер, который использует
пользователь.
HTTP_REFERER - URL страницы, с которой пришел на текущую страницу
пользователь.
Запросы по методу GET
При запросе по методу GET тело запроса передается в командную
строку скрипта. Т.е. если запрашиваемый URL //www.somesite.com/cgi-bin/somescript.cgi,
то вызываться от будет так //www.somesite.com/cgi-bin/somescript.cgi?тело_запроса.
Все тело запроса передается в переменную окружения QUERY_STRING,
тип данных запроса в CONTENT_TYPE, длина в CONTENT_LENGTH.
Запросы по методу POST
При запросе по методу POST тело запроса передается в
стандартный поток ввода скрипта, тип данных запроса в CONTENT_TYPE,
длина в CONTENT_LENGTH.
Независимо от метода запроса данные передаются в виде
шестнадцатиричных символов типа "%2F"("/"), кроме
печатаемых символов. Поэтому предварительно надо позаботиться о перекодировке
в нормальные символы последовательности типа "Thanx%20for%20your%20help%21".
А также заменить "+" на " ".
Ответ на запрос
Как я уже говорил, скрипт отправляет ответ на запрос
на стандартный поток вывода. Этот ответ представляет собой либо данные
сформированные скриптом, либо их местоположение. Вывод должен начинаться
с заголовка, который состоит из следующих полей:
- Content-type - представляет собой MIME-тип возвращаемых данных.
- Location - это поле используется в случае, если возвращаются не сами
данные а ссылка на них. Представляет собой URL.
- Status - используется для задания серверу http2 строки-статуса. Представляет
собой 3-х цифровой код статуса, затем через пробел строку причины. Например
- 404 Not Found.
Затем, через пустую строку, состоящую только из символа
переноса строки, следует тело ответа.
Вызов скрипта
Скрипт можно вызвать разными способами. Самые распространенные
из них:
- По URL'у - с помощью тэга A HREF, с помощью атрибута ACTION
тэга FORM , напрямую задать url в броузере.
В этом случае если скрипт возвращает HTML-документ, он должен вывести
http2-заголовок ( "Content-type=text/html" ), затем сам HTML-документ
начинающийся с тэга HTML и содержащий тэг BODY.
- С помощью exec cgi - в тело вызвающего скрипт HTML документа помещается
коментарий такого вида:
<!--#exec cgi="//www.somesite.com/cgi-bin/somescript.cgi"-->
или
<!--#include virtual="//www.somesite.com/cgi-bin/somescript.cgi"-->
Полный URL не обязательно указывать. Можно и относительный - "cgi-bin/somescript.cgi",
если cgi-bin расположена в том же каталоге, что и html-страница, из
которой вызывается скрипт.
В этом случае скрипт обязательно должен возвращать HTML-документ, вывод
начинается с http2-заголовка, затем следует HTML-документ, не содержащий
тэгов HTML и BODY.
- С помощью тэга IMG SRC - в данном случае скрипт должен возвращать
какую-нибудь картинку. Т.е. сначала http2-заголовок, содержащий "Content-type:
image/gif", "Content-type: image/jpg" и т.д., а затем
содержание картинки в выбранном формате. Такой способ используется в
графических счетчиках посетителей, системах обмена баннерами и т.д.
Обработка форм
Тэг 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 имеет следующие атрибуты:
- TYPE - тип элемента:
hidden - пользователь не видит этого элемента, но его значение передается
скрипту.
image - картинка, на которую можно кликнуть.:)
text - однострочное поле ввода текста.
password - поле ввода пароля, вводимые символы изображаются в виде звездочек.
checkbox - кнопка-переключатель, при нажатии на которую меняется ее
значение на "on" или "off".
radio - кнопка-переключатель, которая как и предыдущая может иметь значения
"on" или "off", отличие от предыдущей в том, что
если одна из таких кнопок на форме имеет значение "on", все
остальные кнопки такого же типа и с тем же параметром NAME, должны иметь
значение "off".( Не слишком навороченное определение? ;) Как
понимаю - так и описываю...:))
submit - кнопка, при нажатии на которую данные формы передаются скрипту.
reset - кнопка устанавливающая во всех полях формы значения по умолчанию.
- NAME - имя поля.
- VALUE - начальное значение поля. Для кнопок типа radio и checkbox
- "on" или "off". Для кнопок типа "submit"
и "reset" - это надпись на кнопке.
Остальные атрибуты INPUT я рассматривать не буду.
Они не столь важны для работы скрипта.
Тэг SELECT создает на форме выпадающее меню. Тэг
имеет следующий синтаксис:
<SELECT NAME="name">
<OPTION> Option1
<OPTION> Option2
............
</SELECT>
Тэг SELECT имеет следующие атрибуты:
- NAME - имя поля.
- MULTIPLE - задает возможность множественного выбора.
Тэг OPTION имеет следующие атрибуты:
- SELECTED - задает выбранную опцию по умолчанию.
Тэг TEXTAREA создает на форме поле ввода многострочного
текста. Тэг имеет следующий синтаксис:
<TEXTAREA NAME="name" ROWS=количество_строк
COLS=количество_столбцов>
Тест, который будет содержать поле по умолчанию
</TEXTAREA>
Тэг TEXTAREA имеет следующие атрибуты:
- NAME - имя поля.
- ROWS - высота.
- COLS - ширина.
Отправка содержания формы происходит при нажатии кнопки
"submit". При отправке формы по методу GET, скрипт, указанный
в атрибуте ACTION тэга FORM содержимое формы передается
в командную строку скрипта после символа "?" в виде:
name1=value1&name2=value2&.......&nameN=valueN
где nameX - имя поля формы, а valueX - его значение.
Для полей ввода текста или пароля значением будет их содержание, введенное
пользователем или установленное по умолчанию, а для chekbox и radio значение,
определенное в атрибуте VALUE, будет передано только для отмеченных
кнопок. При METHOD="POST" строка формируется также, но
передается в стандартный поток ввода.
(c)Ерижоков
А.А., 2000.
Использование данного документа разрешено только с согласия автора и с
указанием первоисточника: DH's
Linux Site
|