CGI.



CGI

    CGI – (Common Gateway Interface – Общий интерфейс маршрутизации) служит для обеспечения связи внешней прикладной программы с Web-сервером. Обычно Web-серверы возвращают статическую информацию, то есть вы набираете некоторый URL (в своем браузере) в котором задаете имя ресурса, который вы хотите получить. Web-сервер анализирует ваш запрос и отсылает вам то что вы там хотели (или сообщение об ошибке, если указанный вами ресурс недоступен) вот вообщем-то и весь World Wide Web. Во всем этом есть одна проблема информация которую посылает сервер по своей природе статична. Сервер не может вам послать больше того что у него есть на момент вашего запроса. Вот чтобы изменить эту ситуацию к лучшему и был введен стандарт CGI. CGI – расширяет возможности Web-сервера, тем что информация поступаемая от Web-сервера приобретает динамический характер. Делается это следующим образом: Если в URL (в броузере) указать не какой-нибудь статический ресурс, а специальную программу (CGI-скрипт) . А сервер проанализировав такой запрос возьмет и запустит ее. А она в свою очередь (пользуясь всеми ресурсами сервера) выдаст некоторую динамическую информацию (например: страничку) . А Web-сервер после окончания работы CGI-скрипта отправит эту информацию броузеру предварительно снабдив ее нужным для протокола HTTP заголовком.

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

    Так вот CGI – и являтся именно тем стандартом который описывает как сервер должен запускать CGI-скрипт, как должен передавать ему параметры HTTP-запроса и как CGI-скрипт должен передавать результаты своей работы серверу. Вот об этом мы и поговорим.

    CGI-скрипт – это программа поддерживающая интерфейс CGI, она может быть написана на любом языке программирования (Perl, C/C++, Fortran, Unix Schell, Visual Basic, Delphi, Pascal, Apple Script, Java, Oberon, ... на любом) все будет зависеть от сервера на котором будет работать данная программа. Как выполнимый модуль она обычно распалагается в директории /cgi-bin сервера или в директории /scripts (на самом деле это зависит от настроек Web-сервера, просто ему надо знать из какой директории надо запускать программы , а из какой пересылать находящиеся там данные). Существуют также такие CGI-скрипты которые взаимодействуют с ППО (прикладным программным обеспечением) сервера (СУБД, электронные таблицы, деловая графика), а по результатам взаимодействия создают ответ и передают его серверу, который в свою очередь отсылает его пользователю. Такие CGI-скрипты называются шлюзами они выполняют роль переходника между пользователем и ППО сервера.

    Ну а теперь рассмотрим структуру CGI. Во-первых рассмотрим каким-образом сервер передает CGI-скрипту информацию об HTTP-запросе. А делает он это следующем образом: Перед запуском CGI-скрипта Web-сервер создает для него Переменные окружения (Environment variables) или как их еще называют переменные среды и записывает в них всю информацию о текущем запросе. Перечислим их:

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

REQUEST_METHOD – Это одна из самых главных переменных используемая для определения метода запроса HTTP.

Пример:REQUEST_METHOD=GET

QUERY_STRING - Это строка запроса при методе GET.

Пример:QUERY_STRING= name=Vasya&age=19&hobby=games

CONTENT_LENGTH - Длина в байтах тела запроса. Соответствует полю Content-Length в протоколе HTTP.

Пример:CONTENT_LENGTH=31

CONTENT_TYPE - MIME тип тела запроса (для форм кодированых выше указаным образом он application/x-www-form-urlencoded ). Соответствует полю Content-Type в HTTP протоколе

GATEWAY_INTERFACE - Версия протокола CGI.

Пример:GATEWAY_INTERFACE=CGI/1.1

REMOTE_ADDR - IP-Адрес клиента , делающего данный запрос.

Пример:REMOTE_ADDR=192.168.3.1

REMOTE_HOST - Если запрашивающий клиент имеет доменное имя, то эта переменная содержит его, в противном случае - тот же самый IP-адресс что и в REMOTE_ADDR

Пример:REMOTE_HOST=uni-vologda.ac.ru

SCRIPT_NAME - Имя скрипта, использованое в запросе. Для получения реального пути на сервере используйте SCRIPT_FILENAME.

Пример:SCRIPT_NAME=/~rva/guestbook.cgi

SCRIPT_FILENAME - Имя файла скрипта на сервере.

Пример:SCRIPT_FILENAME=/students/rva/cgi-bin/guestbook.cgi

SERVER_NAME - Имя серера ,чаще всего доменное как www.microsoft.com ,но в редких случаях за неимением такового может быть IP-адресом как 192.168.3.1

Пример:SERVER_NAME=www.vologda.ru

SERVER_PORT - TCP-Порт сервера используюшийся для соединения . По умолчаниию HTTP-порт 80, хотя может быть в некоторых случаях быть другим.

Пример:SERVER_PORT=80

SERVER_PROTOCOL - Версия протокола сервера.

Пример:SERVER_PROTOCOL=HTTP/1.1

SERVER_SOFTWARE - Програмное обеспечение сервера.

Пример:Apache/1.0

AUTH_TYPE, REMOTE_USER - Эти переменные определены в том случае,когда запрошеный ресурс требует аутентификации пользователя.

Переменные заголовка HTTP-запроса.

    За исключением тех строк из заголовка HTTP-запроса, которые уже названы, сервер приделывает строкам префикс HTTP_ и заменяет знаки '-' на '_':

HTTP_ACCEPT - Давая запрос на сервер браузер обычно расчитывает получить информацию определеного формата,и для этого он в заголовке запроса указывает поле Accept:,Отсюда скрипту поступает cписок тех MIME,которые браузер готов принять в качестве ответа от сервера.

Пример:HTTP_ACCEPT=text/html,text/plain,image/gif

HTTP_USER_AGENT - Браузер обычно посылает на сервер и информацию о себе,чтоб базируясь на знании особеностей и недостатков конкретных браузеров CGI-скрипт мог выдать информацию с учетом этого. Например,разные браузеры могут поддерживать или не поддерживать какие-то HTML тэги.

Пример:HTTP_USER_AGENT=Mozila/2.01 Gold(Win95;I)

И другие всего их около 30.

    CGI-скрипт получает доступ к значениям этих переменых через функции операционной системы (в разных операционных системах это реализуется по разному), тем самым CGI-скрипт получает исчерпывающую информацию об HTTP-запросе. А тело запроса (если оно конечно есть) поступает на STDIN (стандартный поток ввода) скрипта. Размером CONTENT_LENGTH байт.

Заголовок ответа CGI программы.

    Тепреь обсудим каким образом CGI-скрипт должен посылать информацию Web-серверу с точки зрения CGI.

    Если CGI-скрипт хочет послать что-то в ответ, то он должен сделать это следующим образом. Все выводимые данные должны помещаться в STDOUT скрипта. При этом должен обязательно присутствовать CGI-заголовок (CGI-Header). В CGI-заголовоке могут быть следующие поля:

Content-Type: – должно обязательно присутствовать, если есть тело ответа. Определяет MIME-тип ответа.

Например: Content-Type:text/html

Location: - Должно содержать URL – ресурса на который перенаправляется запрос, как правило в этом случае больше ничего не указывается (т.к запрос перенаправляется на другой сервер)

Например: Location:http://www.idsoftware.com/index.html

Status: - Содержит код завершения работы CGI-скрипта. Если не указан то подразумевается 200 Ok

Например: Status:404 Not found

    Далее после CGI заголовка на STDOUT посылается пустая строка, которая отделяет заголовок от тела ответа. И после ее посылается собственно тело ответа тип которого был указан в Content-Type (рисунок, текст HTML или другое).

    Web-сервер получив через STDOUT информацию поступившую от CGI-скрипта формирует на базе ее HTTP-ответ который и посылается клиенту (броузеру).

NPH - скрипты.

    Следует сказать что CGI-скрипт может сам без участия Web-сервера сформировать полностью HTTP-ответ. Такие CGI-скрипты называются - Non-Parsed-Headers , и как отличие их имена должны начинаться с приставки – “nph-” или для Windows – ориентированных Web-серверов первая помещаемая в STDOUT строка должна быть такая “HTTP/1.0” , т.е. версия протокола HTTP, тогда сервер будет считать что данный CGI-скрипт будет nph CGI – скриптом.

Например: nph-animate.cgi

Передача параметров CGI-скрипту.

CGI-скрипту можно передавать параметры. Синтаксис этого такой: <URL-скрипта>?Param1&Param2=value&Param+2b%20%5B%5C%5D%5E , где ? – означает что дальнейшие данные рассматриваются как параметры; & - этим символом параметры отделяются друг от друга; % - после этого символа идет 16-й код символа, это необходимо потому-что не все символы можно использовать в командной строке, а с помощью % можно задать абсолютно любой символ; + - определяет пробел (пробелы нельзя использовать в явном виде в командной строке); параметры могуг разбиваться на две части на имя и значение с помощью знак равенства (для удобства). Параметры в зависимости от метода HTTP-запроса передаются CGI-скрипту (при GET присоединяются к командной строке, а при POST поступают как тело запроса на STDIN скрипта). Использование параметров более подробно будет описано, когда речь пойдет об HTML – формах.

Пример CGI-скрипта (я написал пример на языке Pascal т.к. думаю, что c языком Pascal знакомы почти все ) .

Program TestCGI;
{WriteLn –стандартная функция для записи в STDOUT в языке Pascal}
Begin
    WriteLn(‘Content-Type:text/html’);{CGI– заголовок указан тип MIME передавемых данных }
    WriteLn;{ Пустая строка отделяющая заголовок от тела ответа }
    WriteLn(‘<HTML>’);{Тело ответа}
    WriteLn(‘<H1>Hello World</H1>’);
    WriteLn(‘</HTML>’);
End.

Откомпилируйте данную программу (с помощью компилятора для той операционной системе в которой она будет работать). Поместите ее в директорию /cgi-bin вашего сервера. И попробуйте запустить (из броузера указав ее URL ). Она выведет вам приветствие Hello World.

Применения CGI скриптов.

А сейчас рассмотрим некоторые применения CGI-скриптов.

    Прежде всего CGI используется при обработке HTML – форм. Также для создания счетчиков посещений, гостевых книг и чатовых систем.

Счетчики.

Одним из самых популярных CGI-приложений являются счетчики. Устройство работы его простое CGI-приложение запускается вместе со страничкой. А при запуске считывает старое число посещений из файла на сервере (например counter.dat) инкременирует и записывает его обратно в этот файл вместо старого числа и при желании отображает его на странице. Но при таком методе не будут отфильтровываться лишние нажатия на ReLoad чтобы их убрать можно в этом файле указывать еще IP-адрес с которого запускается данный скрипт и текущее время. А после считывать IP-адрес и если он такой же а время изменилось не болле чем на 30 секунд с последнего посещения то не записывать ничего нового в этот файл (так например поступает счетчик в Ramblere).

С помощью CGI можно создавать анимацию.

    На самом деле создавать анимацию на Web-страницах можно десятками способов. Мы рассмотрим как это можно сделать с помощью CGI. Напишем программу которая выводит последовательно несколько рисунков (по такому же принципу что и анимированный Gif ) для максимальной быстроты будем использовать nph-CGI – скрипт, и воспользуемся многостраничным MIME c заменой предидущей страницы. Рисунки должны храниться с такими же именами как в массиве File данной прогамме.

Program Anim_CGI;
Const
    N:=10;{Число изображений}
    File1:Array[0..N-1]Of String =(‘file0.gif’,’file1.gif’,’file2.gif’,’file3.gif’,’file4.gif’, ‘file5.gif’,’file6.gif’,’file7.gif’,’file8.gif’,’file9.gif’);{Массив из имен файлов изображений}
Procedure SendFile(FileName: String);{Процедура отправки изображения именем FileName}
Var
    F:file;
    Buf:char;
Begin
    Assign(F,FileName);
    Reset(F);
    While Not Eof(F) Do Begin
        Read(F,Buf);
        Write(Buf);
    End;
    Close(F);
End;
Var
    I:Integer;
    Cont:boolean;
Begin
    WriteLn(‘HTTP/1.0 200 OK’);{nph – скрипт (полный HTTP-ответ) }
    WriteLn(‘Content-Type:multipart/x-mixed-replace;boundary=myboundary’);{многостраничное MIME}
    WriteLn;
    WriteLn(‘--myboundary’);{Разделитель}
    Cont:=true;
    I:=0;{Счетчик}
    While Cont Do Begin {Зацикливание}
        If I = MaxInt – MaxInt mod N Then I:=0;
        WriteLn(‘Content-Type:image/gif’);
        WriteLn;
        SendFile(File1[I mod N]);
        WriteLn;
        WriteLn(‘--myboundary’);
        I:=I+1;
    End;
End.

    Откомпилируйте данную программу (с помощью компилятора для той операционной системе в которой она будет работать). Поместите ее в директорию /cgi-bin вашего сервера. Затем в ваш HTML – документ добавьте следующий тег - <IMG SRC=”cgi-bin/Anim_CGI.exe”>

ISMAP.

Рассмотрим еще одно применение CGI - это изображения ismap.Допустим в вашем HTML – документе есть следующая строка:

<A HREF=”cgi-bin/ismap_test.exe”> <IMG SRC=”somepic.gif” BORDER=0 ISMAP></A>

При нажатии на эту ссылку запуститься CGI-скрипт (указанный в атрибуте HREF тега <A>), но кроме этого в параметры CGI-скрипта передаются координаты указателя мыши в момент нажатия относительно изображения о чем и свидетельствует атрибут ISMAP тега <IMG>. Координаты передаются так – http://somehost/cgi-bin/ismap_test.exe?5,12

Ну а как это использовать зависит лишь от вашей фантазии.

[Назад],[В Главное меню]