[Назад] [Дальше] [Содержание]

МЕХАНИЗМ РАБОТЫ CGI ПРОГРАММ

Как уже было сказано, CGI получает входные данные со стандартного потока ввода stdin или из переменных окружения, а выводит результаты своей работы в стандартный поток вывода stdout. Для тех. кто не знает, что это такое:
Стандартный поток ввода (stdin) - отсюда программа (скрипт) по-умолчанию получает входную информацию. Обычно это клавиатура, но его можно переназначить, и программа (скрипт) будет получать входные данные из файла, сокета, выходного потока другой программы.

Переменные окружения (environment variables) - переменные, определенные для системы и сервера, на которой будет выполняться CGI. Основные переменные, определяемые для этого сервера можете посмотреть здесь, а с кратким описанием назначения переменных можно ознакомиться в Приложении 1 .

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

Большинство примеров в этом руководстве написано на shell только для того, чтобы упростить изложение материала.

Согласно последним веяниям по соблюдению безопасности не рекомендуется использование shell для написания CGI скриптов.

Если вам захочется научиться писать на shell, то можете почитать это руководсто.

1.1 Вызов CGI без параметров

Простейший скрипт, выводящий текущую дату:

  #!/bin/sh
  echo Content-type: text/html
  echo
  echo "<h2>Today is "
  date
  echo "</h2>"
В HTML документе ссылка на него описывется вот таким образом
  <a href="/cgi-bin/examples/today.cgi">
а работает он вот так.

ВАЖНОЕ ЗАМЕЧАНИЕ. Основной ошибкой, которую совершают почти все, кто начинает писать CGI программы или скрипты, заключается в том, что они забывают вставить указатель на тип выводимого результата - заголовок выводимого документа. Это вторая и третья строчки в примере.

  echo Content-type: text/html
  echo
где Content-type: - тип выводимого документа (text/html, image/gif, image/jpeg и т.д.).
Пустая строка в выводе говорит о том, что заголовок кончился и далее следует собственно сам документ.

1.2 Передача параметров CGI скрипту или программе

Передача параметров осуществляется двумя основными методами: GET и POST. У каждого из них свои достоинства и недостатки.

При использовании GET параметры добавляются к запрашиваемому URL и его можно вызывать таким образом:

  http://какой-то_хост/cgi-bin/какой-то_скрипт?параметры
что позволяет делать на такой скрипт ссылки в HTML документах. А на сервере переданные параметры присваиваются переменной QUERY_STRING.

Пример работы (ткните тут)

Текст самого скрипта:

  #!/bin/sh
  echo Content-type: text/html
  echo
  echo "<h2>Вы посылали вот это:</h2>"
  echo "<b>"
  set | grep QUERY_STRING
  echo "</b><br><hr>"
  echo "<b>Environment</b><br><pre>"
  set
  echo "</pre>"
и как он вызывался из этого документа:
  <a href="/cgi-bin/examples/link.cgi?some_parameters">
  Пример работы (ткните тут)
  </a>

Но применение метода GET для передачи параметров, содержащих конфиденциальную информацию недопустимо, т.к. в данном случае вся эта информация передается открыто. За дополнительной информацией по обеспечению безопасности в Web можете обратиться к WWW Security FAQ.

Метод POST позволяет обеспечить конфиденциальность при передаче параметров скрипту. Но он передает параметры на стандартный поток ввода и для этого приходится использовать формы. Сервер не посылает скрипту EOF в конце передачи. Вместо этого вам придется использовать пременную окружения CONTENT_LENGTH, чтобы определить какой объем данных вам надо считать из stdin. Подробнее о HTML FORM вы можете почитать например здесь.

1.3 Примеры

Метод GET

Press me.
А в документе эта форма была описана так:
  <FORM ACTION="/cgi-bin/examples/forms.cgi" METHOD="GET">
  <INPUT TYPE="checkbox" NAME="button" VALUE="on"> Press me.
  <INPUT TYPE="submit" VALUE="Submit">
  </FORM>

Метод POST

Press me.
А в документе эта форма была описана так:
  <FORM ACTION="/cgi-bin/examples/forms.cgi" METHOD="POST">
  <INPUT TYPE="checkbox" NAME="button" VALUE="on"> Press me. 
  <INPUT TYPE="submit" VALUE="Submit">
  </FORM>
А скрипт, который запускался был один и тот же и выглядел вот так:
  #!/bin/sh
  echo Content-type: text/html
  echo
  echo "<b>Вы посылали вот это (только для метода POST):</b><br>"
  echo "<h2>"
  cat
  echo "<br>"
  set | grep CONTENT_LENGTH
  echo "</h2><hr>"
  echo "<b>Environment</b><br><pre>"
  set
  echo "</pre>"

[Назад] [Дальше] [Содержание]

Copyright © 1998-99 Vladimir Schuckovsky
Вопросы, предложения и здоровая критика
приветствуются по адресу: vovcha@pvrr.ru