Информация о CGI


Прислал: NAS [ 01.10.2000 @ 13:23 ]
Раздел:: [ Статьи по Perl ]


Информация о CGI.

CGI-скрипт представляет собой программу, запускаемую демоном http2d, выполняющую какие-то действия и возвращающую данные демону http2d для передачи их пользователю в броузер. CGI-скрипт является шлюзом ( как следует из названия Common Gateway Interface ), который во взаимодействии с такими прикладными системами, как СУБД, электронные таблицы, системы обработки графической информации и т.д. возвращает пользователю ответ на его запрос в виде HTML-страницы, GIF-картинки или другого средства представления информации.

CGI-скрипт ( в дальнейшем я буду просто писать "скрипт", лень постоянно на английский переключаться....:)), на каком бы языке он не был написан, получает от демона http2d информацию тремя способами:

  1. Через переменные окружения.
  2. Через командную строку.
  3. Через стандартный ввод.

Возвращает скрипт эту информацию через стандартный вывод.

Переменные окружения

Вот список переменных окружения и их значения:

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". А также заменить "+" на " ".

Ответ на запрос

Как я уже говорил, скрипт отправляет ответ на запрос на стандартный поток вывода. Этот ответ представляет собой либо данные сформированные скриптом, либо их местоположение. Вывод должен начинаться с заголовка, который состоит из следующих полей:

  1. Content-type - представляет собой MIME-тип возвращаемых данных.
  2. Location - это поле используется в случае, если возвращаются не сами данные а ссылка на них. Представляет собой URL.
  3. Status - используется для задания серверу http2 строки-статуса. Представляет собой 3-х цифровой код статуса, затем через пробел строку причины. Например - 404 Not Found.

Затем, через пустую строку, состоящую только из символа переноса строки, следует тело ответа.

Вызов скрипта

Скрипт можно вызвать разными способами. Самые распространенные из них:

  1. По URL'у - с помощью тэга A HREF, с помощью атрибута ACTION тэга FORM , напрямую задать url в броузере.
    В этом случае если скрипт возвращает HTML-документ, он должен вывести http2-заголовок ( "Content-type=text/html" ), затем сам HTML-документ начинающийся с тэга HTML и содержащий тэг BODY.
  2. С помощью 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.
  3. С помощью тэга 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 имеет следующие атрибуты:

  1. TYPE - тип элемента:
    hidden - пользователь не видит этого элемента, но его значение передается скрипту.
    image - картинка, на которую можно кликнуть.:)
    text - однострочное поле ввода текста.
    password - поле ввода пароля, вводимые символы изображаются в виде звездочек.
    checkbox - кнопка-переключатель, при нажатии на которую меняется ее значение на "on" или "off".
    radio - кнопка-переключатель, которая как и предыдущая может иметь значения "on" или "off", отличие от предыдущей в том, что если одна из таких кнопок на форме имеет значение "on", все остальные кнопки такого же типа и с тем же параметром NAME, должны иметь значение "off".( Не слишком навороченное определение? ;) Как понимаю - так и описываю...:))
    submit - кнопка, при нажатии на которую данные формы передаются скрипту.
    reset - кнопка устанавливающая во всех полях формы значения по умолчанию.
  2. NAME - имя поля.
  3. VALUE - начальное значение поля. Для кнопок типа radio и checkbox - "on" или "off". Для кнопок типа "submit" и "reset" - это надпись на кнопке.

Остальные атрибуты INPUT я рассматривать не буду. Они не столь важны для работы скрипта.

Тэг SELECT создает на форме выпадающее меню. Тэг имеет следующий синтаксис:

<SELECT NAME="name">
<OPTION> Option1
<OPTION> Option2
............
</SELECT>

Тэг SELECT имеет следующие атрибуты:

  1. NAME - имя поля.
  2. MULTIPLE - задает возможность множественного выбора.

Тэг OPTION имеет следующие атрибуты:

  1. SELECTED - задает выбранную опцию по умолчанию.

Тэг TEXTAREA создает на форме поле ввода многострочного текста. Тэг имеет следующий синтаксис:

<TEXTAREA NAME="name" ROWS=количество_строк COLS=количество_столбцов>
Тест, который будет содержать поле по умолчанию
</TEXTAREA>

Тэг TEXTAREA имеет следующие атрибуты:

  1. NAME - имя поля.
  2. ROWS - высота.
  3. COLS - ширина.

Отправка содержания формы происходит при нажатии кнопки "submit". При отправке формы по методу GET, скрипт, указанный в атрибуте ACTION тэга FORM содержимое формы передается в командную строку скрипта после символа "?" в виде:

name1=value1&name2=value2&.......&nameN=valueN

где nameX - имя поля формы, а valueX - его значение. Для полей ввода текста или пароля значением будет их содержание, введенное пользователем или установленное по умолчанию, а для chekbox и radio значение, определенное в атрибуте VALUE, будет передано только для отмеченных кнопок. При METHOD="POST" строка формируется также, но передается в стандартный поток ввода.


(c) Ерижоков А.А.( mailto:daniel@bsn.ru ), 2000.
Использование данного документа разрешено только с согласия автора и с указанием первоисточника: DH's Linux Site ( http://webscript.ru/mailto:adlan@i.am )