Серж де Арт / Статьи

Введение в CGI

© 1998 Серж де Арт (Сергей Свистунов)

1. Общие сведения

Последняя версия CGI/1.1

CGI — это абревиатура для «Common Gateway Interface», что значит «Шлюзовый Интерфейс Общего Назначения», который служит в качестве некоторого стандарта для взаимодействия WWW сервера с внешними программами. Обычные документы (html-файлы), которые сервер высылает по запросам клиентов являются статичными. Это значит, что они были заранее подготовлены автором и размещены в специальном (под)каталоге, с которым работает сервер. Программы CGI, позволяют формировать документы динамически («на лету») по некоторому шаблону. Допустим, на вашей машине установлена база данных и однажды нам захотелось обеспечить к ней доступ через WWW. В данном случае CGI — это как раз то что надо. Программист должен написать CGI программу, которая будет запускаться www-сервером (http демоном) при получении запроса от клиента. Получив от сервера информацию, эта программа передаст ее в базу данных. Полученный из Базы данных ответ будет предан обратно по цепочке на машину клиента. Это и есть шлюз. Причем, именно необходимость работы с базами данных привела к возниконовению CGI версии 1.1.

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

Использование шлюзовых программ не ограничивается только базами даных, и на самом деле граница определяется фантазий программиста.

Поскольку CGI это нечто, что позволяет посторонним людям запускать на вашей машине программу, здесь потенциально возникают проблемы безопасности. Поэтому, должны тщательно соблюдаться меры предосторожности. Программы CGI должны располагаться в специальном директории, чтобы сервер смог «догадаться» что программу нужно запустить на выполнение, а не пересылать ее на компьютер клиента. Этот директорий как правило устанавливает вебмастер, тем самым ограничивая доступ обычным пользователям для создания шлюзовых программ. Если у вас установлен сервер типа NCSA HTTPd, то директорий о котором идет речь будет называться /cgi-bin. В нем-то и располагаются все шлюзовые программы для данного сервера.

Программа CGI может быть написана на любом языке, который позволяет сосставлять программы выполнимые на вашей платформе, например:

  • C/C++
  • Fortran
  • PERL
  • TCL
  • Любой Unix shell
  • Visual Basic
  • AppleScript
Другие технологии для CGI:
  • Cold Fusion - сторонняя программа для связи форм с базами данных.

  • PHP/FI - еще одна сторонняя программа для связи форм с базами данных.

    Дик Брэндон, PHP/FI Version 2.0 (перевод на русский Юрия Плетнева)

    Если вы программируете на C или Фортране, то перед выполнением вы компилируете программу. Заглянув в директорий /cgi-src который поставляется с дистриубутивом сервера, вы найдете там исходные тектсты программ, расположенных в директории /cgi-bin. Если же вы используете какой-либо скриптовый язык, скажем PERL, TCL, или Unix shell, то в специальном каталоге размещается сам скрипт. Многие предпочитают писать CGI скрипты вместо программ, поскольку их легче отлаживать, изменять и поддерживать чем типовые откомпилированные программы.

    Итак, схема работы CGI:

    запрос: форма(веб-браузе/клиент) - передача - сервер - cgi-вызов - CGI
    ответ: CGI - ответ - сервер - ответ сервера - клиент/браузер

    Для создания эффективных CGI-программ необходимо разобраться в HTTP (структура заголовков, коды состояния)

    2. Формы

    Для работы с CGI программами используются формы, размещаемые в теле html документа. Синтаксис тега Form (см. HTML) :

    <form method="METHOD" action="URL"> ... </form>

    Атрибуты означают следующее:

    • ACTION означает URL сервера которому посылается содержимое формы; если данный атрибут отсутствует, то используется URL текущего документа.
    • METHOD представляет из себя один из методов HTTP/1.0 для передачи формы на сервер. Какой метод использовать зависит от того как работает сервер. Крайне рекомендуется использовать метод POST. Допускаются следующие методы:
      • GET -- данный метод является методом по умолчанию. Содержимое формы добавляетя в конце URL.
      • POST -- при данном методе данные посылаются на сервер в теле документа а не как часть URL.
    • ENCTYPE специфицирует кодирование содержимого формы. Данный атрибут может использоваться только в случае, если атрибут METHOD установлен в POST, и даже в этом случае допустимо только одно значение (по умолчанию, application/x-www-form-urlencoded).

    Внутри Формы можно вставлять все что угодно кроме других Форм. Обычно используются тэги INPUT, SELECT, и TEXTAREA для более богатого интерфейса формы.

    Отправка формы

    Метод GET

    Когда пользователь нажимает кнопку «Submit», он тем самым инициирует передачу содержимого формы на сервер. При методе GET, нужная информация добавляется к заголовку URL, и выглядит так:

    action?name=value&name=value&name=value

    где «action» есть указанный URL. Параметры с приписанными значениями разделяются знаком &.

    Метод POST

    Данные посылаются не в заголовке а в теле сообщения.

    3. Как работает CGI

    Часто бытует неверное представление, что в cgi-программу можно посылать опции командной строки и аргументы как показано ниже:

    command% myprog -qa blorf

    Однако, CGI использует командную строку для других целей. Вместо командной строки для передачи параметров в программу, CGI использует переменные среды. Две главные переменные среды для передчачи параметров:

    QUERY_STRING

    Данная переменная определяет то, что стоит за знаком ? в URL. Данная информация добавляется либо из тега ISINDEX, либо из HTML формы по команде GET. Она может быть также присвоена вручную в якорь HTML который указываетна ваш шлюз. Обычно эта строка является информационным запросом, т.е. тем что пользователь хочет найти в базе данных, или закодированным результатом вашего ответа.

    Эта строка кодируется в стандартный формат URL, заменяя пробелы на +, и кодирую специальные симолы в %xx (шестнадцатиричные коды). Прежде чем использовать их нужно будет сначала раскодировать.

    Если ваш шлюз не сможет раскодировать результаты из Формы, то вы получите также в командной строке закодированную строку. Это означает, что каждое слово в переменной среды будет относится к одтельной секции ARGV. Например, строка «forms rule» будет передана в программу с argv[1]=«forms» и argv[2]=«rule». Если вы решите использовать их в этом виде, тогда необходимость в обработке данных перед их использованием отпадает.

    PATH_INFO

    Дополнительная информация о пути

    Помимо строк запросов можно передавать в URL дополнительные данные, называемые дополнительной информацией о пути (extra path information).

    Дополнительные данные помещаются в переменную среды PATH_INFO

    Например: http://domain/cgi-bin/display.pl/cgi/cgi_doc.txt

    5. Создание виртуальных документов (ответ сервера)

    После завершения обработки полученной информации CGI-программа должна:

    - создать новый документ или

    - указать ссылку на существующий документ

    В ОС UNIX программы посылают выходную информацию на стандартный вывод (STDOUT) как поток данных состоящий из двух частей:

    1 часть: Полный или частичный HTTP-заголовок Пустая строка обозначает конец заголовка

    2 часть: Тело выходных данных. В нем содержатся данные в формате, который задан в заголовке.

    Пример:

    	Content-type: text/html
    
    	
    	...
    	
    
    
    Строка частичного заголовка содержит медиа-тип HTML (text/html) Эта строка важна для каждой CGI-программы, поскольку она говорит браузеру о том, как следует обрабатывать дальнейшие данные.

    Сервер возвращает результаты выполнения CGI-программы браузеру. Обычно сервер снабжает возвращаемые данные дополнительными заголовками.

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

    Пример полного заголовка:

    HTTP/1.0 200 OK
    Date: ...
    Server: ...
    Content-type: text/html
    Content-length: 2041 (количество байтов)
    
    
    ...
    
    
    
    6. Кодирование URL (шестнадцатиричное кодирование)

    Перед передачей формы на сервер, формируются пары ключ-значение. Эти пары отделяютя друг от друга амперсандом (&)

    При использовании метода GET данные формы передаются как часть URL. Таким образом они не могут включать пробелы и другие специальные символы которые недопустимы в URL или уже заняты (/)

    Для совместимости это ограничение накладывается и на метод POST.

    Чтобы избежать это ограничение, Браузер перед отправкой делает операции кодирования.

    Кодирование - замена пробелов и других спец. символов в строках запросов их шестнадцатеричными эквивалентами.

    Например строка 11/05/73 будет перекодирована и передана как

    birthday=11%2F05%2F73

    Символ пробела кодируется двумя способами: %20 или +

    В программе CGI необходимо предусмотреть «декодирование» данных.

    7. Переменные среды CGI

    - Основная часть информации передается в CGI-программы через переменные среды OC UNIX

    - На разных серверах имена переменных среды могут различаться

    AUTH_TYPE

    метод аутентификации пользователя

    CONTENT_LENGTH

    длина в байтах или знаках данных запроса, передаваемых в программу CGI через стандартный ввод

    CONTENT_TYPE

    Медиа-тип данных запроса, например text/html.

    DOCUMENT_ROOT

    Корневой каталог дерева документов сервера

    GATEWAY_INTERFACE

    Версия интерфейса CGI, с которой работает пользователь

    HTTP_ACCEPT

    Перечень медиа-типов, которые может принимать клиент

    HTTP_FROM

    Адрес электронной почты пользователя, направившего запрос

    HTTP_REFERER

    URL документа, на который клиент указывает перед обращением к программе CGI

    HTTP_USER_AGENT

    Браузер, которым клиент пользоуется для выдачи запроса

    PATH_INFO

    Дополнительная информация о пути, передаваемая в программу CGI

    PATH_TRANSLATED

    Конвертированная версия пути, заданного в переменной PATH_INFO

    QUERY_STRING

    Информация о запросе, переданная в программу. Для присоединения этой информации к URL используется знак "?".

    REMOTE_ADDR

    Удаленный IP-адрес, с которого пользователь посылает запрос REMOTE_HOST
    Имя удаленной хост-машины, с которой пользователь посылает запрос

    REMOTE_IDENT

    Идентификатор пользователя, посылающего запрос

    REMOTE_USER

    Аутентифицированное имя пользователя, посылающего запрос

    REQUEST_METHOD

    Метод который использовался для выдачи запроса (GET, POST, HEAD)

    SCRIPT_NAME

    Имя выполняемого сценария (/cgi-bin/program.pl)

    SERVER_NAME

    Хост-имя или IP-адрес сервера

    SERVER_PORT

    Номер порта хост-машины, на которой работает сервер

    SERVER_PROTOCOL

    Имя и версия информационного протокола, который был использован для запроса

    SERVER_SOFTWARE

    Имя и версия программного обеспечения сервера, которое отвечает на запрос клиента

    Санкт-Петербург, Июль 1998

  • *

    [ Вверх ]

    Серж де Арт / Статьи