Как работает CGI-программа

назад

CGI - это стандарт, или набор правил, определяющих как Web-сервер и внешняя по отношению к нему программа общаются между собой. Для иллюстрации того, как это все работает, я приведу описание полного сеанса HTTP, чтобы вам было легче понять взаимосвязь явлений.

Как делается запрос на ресурс

Сеанс HTTP (процесс передачи данных по протоколу HTTP) начинается с того, что клиент (обычно это Web-броузер) запрашивает некоторый ресурс у Web-сервера. Вы, конечно, помните, что всякий ресурс однозначно определяется своим URL (uniform resourse locator). Когда речь идёт о простых статических Web-страницах, ресурс представляет собой файл, а URL - положение этого файла на диске.

Предположим, в нашем случае URL выглядит так:
http://w-wb.com/cgi/cgi_01_02.php

Этот URL соответствует файлу cgi_01_02.php расположеному в папке cgi корневого каталога Web-сервера.

Если Web-серверу удалось найти и прочитать этот файл, содержимое файла передается запросившему его броузеру.

Если же URL указывает на CGI-программу, все обстоит немного сложнее. Давайте для примера рассмотрим следующий URL:
http://w-wb.com/cgi-bin/example.cgi

В данном случае запрошенным ресурсом является программа с именем example.cgi. Что именно делает эта программа не важно, важно то, что когда сервер видит, что затребованна программа, он запускает ее на выполнение и передает возвращенные ей данные броузеру.

Этот процесс существенно отличается от обмена статичными HTML-файлами. Прежде всего, возникает гораздо больше поводов для ошибочной ситуации. Когда запрошена CGI-программа, сервер должен проверить следущее.

  1. Существует ли запрошенный файл?

  2. Действительно ли запрошенный файл является CGI-программой?

  3. Есть ли разрешение на выполнение этой программы?

  4. Выполнилась ли программа без ошибок?

  5. Соответствуют ли выходные данные программы запросу броузера? (Эту проверку мы рассмотрим чуть ниже.)

Только в случае положительного ответа на все эти вопросы сервер может успешно обслужить запрос. Если хотя бы на один из вопросов получен отрицательный ответ, возникает сообщение об ошибке или просто происходит не то что ожидалось.

Как выполняется запрос

Как говорилось выше, CGI-программа должна генерировать заголовок типа возвращаемых данных, для того чтобы броузер знал, что возвращает программа. Типы возвращаемых данных определяются стандартом MIME. Обычно стандарт MIME ассоциируется с почтовыми сообщениями, но в случае с типом данных работает та же самая система, что и с типом данных, вложенных в сообщение электронной почты. В следующей таблице перечисленны типы данных, которые может возвращать CGI-программа.

Типы данных, возвращаемых CGI-программой
ИдентификаторТип данных
text/htmlДокументы HTML
text/plainПростой текст
image/gifРисунок GIF
image/jpegРисунок JPEG
video/quicktimeАнимация QuickTime
application/octet-streamБинарный файл

Если программа возвращает текст HTML, она должна генерировать такой заголовок типа данных:

Content-type: text/html

Эта информация передаётся серверу, который вместе с другими заголовками передает ее броузеру. Протокол HTTP требует, чтобы заголовок отделялся от содержания двумя символами перевода строки. Когда броузер встречает два последовательных символа перевода строки, он понимает, что заголовок закончился и начинается блок данных, которые должны быть обработаны. Таким образом, проболжая наш пример, если программа example.cgi возвращает HTML-текст, ее полный вывод должен выглядеть приблизительно так:

Content-type: text/html

<html>
<head><title>Простой пример</title></head>
<body>Это простой пример</body>
</html>

Как вы видите, необходимый заголовок отделен от собственно содержания двумя символами перевода строки. (Обратите внимание - два перевода строки выглядят как одна пустая строка!) Кроме того, сервер может включить в передаваемые данные другие заголовки и другие блоки данных. В этом случае полный ответ сервера броузеру может выглядеть так:

HTTP/1.1 200 OK
Date: Sun, 10 Jul 2004 04:21:37 GMT
Server: Apache/1.3.3
Connection: close
Content-type: text/html

<html>
<head><title>Простой пример</title></head>
<body>Это простой пример</body>
</html>

Заголовки HTTP

Значительная часть информации при сеансе HTTP, видна пользователю. Например, запрашиваемый URL или данные, введённые в таблицу, непосредственно видны на экране броузера. Текст HTML, возвращённый сервером, также выводится на экран.

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

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