1. Общие сведения
CGI это абревиатура для «Common Gateway Interface», что
значит «Шлюзовый Интерфейс Общего Назначения», который служит
в качестве некоторого стандарта для взаимодействия WWW сервера с внешними
программами. Обычные документы (html-файлы), которые сервер высылает
по запросам клиентов являются статичными. Это значит, что они были заранее
подготовлены автором и размещены в специальном (под)каталоге, с которым
работает сервер. Программы CGI, позволяют формировать документы динамически
(«на лету») по некоторому шаблону. Допустим, на вашей машине
установлена база данных и однажды нам захотелось обеспечить к ней доступ
через WWW. В данном случае CGI это как раз то что надо. Программист
должен написать CGI программу, которая будет запускаться www-сервером
(http демоном) при получении запроса от клиента. Получив от сервера
информацию, эта программа передаст ее в базу данных. Полученный из Базы
данных ответ будет предан обратно по цепочке на машину клиента. Это и есть
шлюз. Причем, именно необходимость работы с базами данных привела
к возниконовению CGI версии 1.1.
Хотя пример с базой данных и выглядит достаточно тривиальным, работа
программы может занять некоторое дополнительное время. Но чтобы не делала
программа, она не должна занимать долго времени. В противном случае
пользователь потеряет ощущение интерактивности.
Использование шлюзовых программ не ограничивается только базами даных,
и на самом деле граница определяется фантазий программиста.
Поскольку CGI это нечто, что позволяет посторонним людям запускать на вашей
машине программу, здесь потенциально возникают проблемы безопасности.
Поэтому, должны тщательно соблюдаться меры предосторожности. Программы CGI
должны располагаться в специальном директории, чтобы сервер смог
«догадаться» что программу нужно запустить на выполнение,
а не пересылать ее на компьютер клиента. Этот директорий как правило
устанавливает вебмастер, тем самым ограничивая доступ обычным пользователям
для создания шлюзовых программ. Если у вас установлен сервер типа NCSA HTTPd,
то директорий о котором идет речь будет называться /cgi-bin. В нем-то
и располагаются все шлюзовые программы для данного сервера.
Программа CGI может быть написана на любом языке, который позволяет
сосставлять программы выполнимые на вашей платформе, например:
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