Cgi для программиста


Содержание

CGI-программирование

Работа с базами данных

Основные принципы работы с базами данных на Perl описаны Брайаном Уилсоном (e-mail: brian.wilson@netscapeworld.com) (см. «Мир ПК», № 11/97, с. 52). Если невозможно найти печатный вариант издания, то можно найти нужную статью на Web-сервере www.pcworld.ru.

CGI-программирование

Понятие о СGI
CGI (Common Gateway Interface) — спецификация программ, которые пользователь может выполнять на Web-сервере. В этом случае устройством ввода-вывода считается программа просмотра гипертекстовых страниц или браузер. CGI представляет собой стандарт взаимодействия Web-сервера с прикладными программами. Программы CGI можно писать на любых языках типа Си++, Паскаль, Visual Basic и им подобным, но тогда возникают ограничения на переносимость ПО с одной серверной платформы на другую. Интерпретатор же Perl сейчас существует практически на любой платформе.

В журнале «Мир ПК», № 8/97, с. 88 была опубликована статья А. и Г. Фроловых «Активный сервер Web: расширения CGI». Поскольку ее авторы в основном специализируются на программировании в Си/Си++, их работа также была ориентирована на разработчиков, использующих именно эти средства в сочетании с MS IIS (Microsoft Internet Information Server).

Рассмотрим ниже аналогичные возможности при программировании на Perl. Ниже будет показано, как реализовать диалог с посетителем Web-страницы или Web-узла, чтобы собирать различную информацию. Будут рассмотрены вопросы создания Perl-программ типа гостевой книги (рис. 1), списка рассылки новостей и простейшей системы идентификации посетителя.

Можно загрузить из Internet практически любые необходимые Perl-программы. Вот несколько узлов, на которых есть ПО на любой вкус: www.freescripts.com, www.scripts.ru, www.basicnet.sonnet.ru/download.

Как же работает механизм взаимодействия клиента с сервером, а конкретнее — с CGI-программой? Из приведенной на рис. 1 схемы видно, что пользователь сначала заполняет форму и подтверждает введенную им информацию нажатием соответствующей кнопки. Затем эти сведения из формы передаются на сервер.

HTML-код нашей формы гостевой книги выглядит следующим образом (листинг 5):

Из всех тегов, присутствующих здесь, непосредственно к форме относятся только .

. Чтобы послать информацию на сервер (запустить на нем CGI-программу, которая обработает введенные данные), к тегу необходимо добавить два параметра: METHOD, обеспечивающий посылку данных, и ACTION, в котором хранится URL к CGI-программе. Существует всего два метода посылки данных на сервер: GET и POST. По умолчанию используется метод пересылки данных.

Значение GET указывает на то, что браузеру следует поместить введенные в форму данные в конец строки адреса URL, передаваемого на HTTP-сервер. Метод особенно удобен для формирования запросов к базам данных, содержимое которых регулярно обновляется. Принимая информацию из формы, CGI-программа записывает их в переменную окружения сервера QUERY_ STRING. Если в форме слишком много данных, то в подобной структуре могут возникнуть проблемы и будет предпочтительнее использовать POST:

Тогда браузер передает принятые данные так, будто они набраны с клавиатуры, т. е. через стандартный ввод (STDIN). Сервер не помечает конец данных символом EOF, поэтому для правильного считывания из STDIN программа должна использовать значение CONTENT_ LENGTH. Далее CGI-программа извлекает параметры из этой переменной так же, как и при обработке любой другой переменной окружения, например хэша или ассоциативного массива. Метод POST более эффективен и надежен, чем GET, потому что каждая из операционных систем накладывает различные ограничения на максимальное количество данных, которое может быть передано с помощью GET. Например, формы, использующие поля

, позволяют пользователям вводить большое количество текста. Они должны всегда применять метод POST:

В параметре ACTION хранится той URL CGI-программы, к которой обращается пользователь при подтверждении формы.

Практически во всех формах, которые приходится заполнять на тех или иных Web-узлах, присутствуют поля ввода и кнопки подтверждения. Все они создаются с помощью тега , который в отличие от и

не имеет закрывающей пары. Тег , равно как и , может содержать несколько атрибутов: NAME, TYPE и VALUE. Обязательными являются первые два:

В результате отображения формы браузером первая строка образует поле для ввода информации (TYPE=«text»), а вторая — кнопку ее подтверждения (TYPE=«submit»). Можно также создать и кнопку сброса введенной информации в форме (TYPE=«reset»). Кроме TYPE используется NAME — второй важный параметр. Он придает каждому объекту формы свое уникальное имя. А в качестве необязательного атрибута тег может содержать VALUE. В него записывается значение, отображаемое в соответствующих элементах формы при ее загрузке. Например, использование VALUE=«@» приведет к тому, что при загрузке формы в браузер поле ввода адреса электронной почты будет содержать символ @.

Кодирование URL

Данные, поступившие из формы, имеют следующий вид:

ИмяX — имя элемента формы, определенное атрибутом NAME, а ЗначениеX — информация, введенная в соответствующее поле. Если в форме присутствует несколько элементов управления (поля ввода, ниспадающие списки, обычные списки, флажки, элементы выбора, кнопки), то пары = разделяются символом &.

Поскольку при использовании метода GET данные формы передаются как часть адреса URL, они не могут включать пробелы и другие специальные символы, применение которых в URL не допускается, а также символы, имеющие в URL другое назначение, например символ «косая черта» (/), причем последнее ограничение накладывается и при использовании метода POST. Для выполнения условий Web-браузер производит кодирование информации, представленной пользователем. Например, все символы пробелов заменяются на «+». Вместо управляющих и некоторых других символов ставится их шестнадцатеричный (HEX) эквивалент.

Cgi для программиста

Настоящая публикация посвещена ряду вопросов CGI-программирования на языке Perl, а именно нетипичным ситуациям генерации выходных данных в среде броузера. Рассматриваются варианты возврата выходных данных с помощью контейнерных HTML элементов: APPLET, SCRIPT, OBJECT, IFRAME (ILAYER для Netscape), а также элемента IMG. Представлены примеры программирования реальных ситуаций (выборка новостной информации из БД, защита copyright и защита от копирования, вывод курса валют on-line без перезагрузки страницы) с использованием Perl, JavaScript, Java, событийно-управляемого языка Flash 5. Показано, что активное взаимодействие сценариев CGI и программ на языках JavaScript, Java, скриптов Flash в значительной степени расширяет возможности представления и обработки выходной информации, позволяет автоматизировать процессы вывода и сократить накладные расходы. Особое внимание уделено разделению CGI программы и HTML-кодирования, что позволяет дизайнерам модифицировать HTML-страницы независимо от CGI-скрипта и независимо от CGI-программиста.

Содержание.

Введение.

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

Судя по литератере, вопросам передачи и обработки данных, включая их запись на диск или в базу данных уделено достаточно много внимания, эти вопросы в той или иной степени затронуты практически в любом руководстве по Web-программированию [1, 2, 3]. Вместе с тем задачи, а в ряде случаев и проблемы, связанные с генерированием выходных данных в среду броузера, освещаются в публикациях и монографиях на уровне фона. Применение же встроенных HTML-функций Perl [2], в задачу которых входит облегчить генерацию HTML-включений непосредственно из CGI-сценария, приводит к тому, что программист и дизайнер должны выступать в одном лице.

В принципе, самый эффективный (с точки зрения разделения CGI программирования и HTML дизайна) способ возврата данных клиенту, это генерация HTML-шаблонов на лету. Шаблон читается CGI сценарием, который выполняет подстановку переменных вместо параметрических включений и потом на лету генерирует страницу в окне броузера. Самый неэффективный способ, это размещение полных HTML-страниц в теле CGI-скрипта. Любое изменение дизайна HTML-страницы, в последнем случае, потребует модифицировать и CGI программу в целом. К чему это приводит, думаю знакомо всем Web-программистам. Вместе с тем, как во втором, так и в первом случаях гибкость и опереративность вывода данных оставляет желать лучшего.

В данной статье мы остановимся, на некоторых промежуточных вариантах вывода данных, обеспечивающих гибкость и опреративность, смысл которых будет понятен ниже, я надеюсь. Представим себе ситуацию, когда в действующую HTML-страницу (файл) потребуется оперативно выводить данные и при этом не затрагивать существующий дизайн. Такими данными могут быть изображения, численные значения счетчиков, ленты новостей, котировки валют on-line, прогнозы погоды и много другое. При этом, в ряде случаев потребуется избавить пользователя от перезагрузки HTML-страницы. На сайтах часто можно встретить предупреждение типа: «Для обновления данных перезагрузите страницу!». Прямолинейным решением может служить перезапись HTM-файлов с помощью CGI-программы, которая предварительно читает файл с диска и изменяет содержимое параметрических включений. Такой подход, плох уже тем, что снижает безопасность, открывая доступ каждому (everyone) к записи на диск. Мы рассмотрим другие варианты, а именно, формирование запросов CGI-ресурсов путем использования контейнерных HTML элементов: APPLET, SCRIPT, OBJECT, IFRAME (ILAYER для Netscape), ну и конечно элемент IMG. С последнего и начнем.

§1. Загрузка ресурса IMG.

Задача.
Вы хотите, чтобы на вашей HTML-странице, случайным образом, загружались бы графические изображения, перечень которых может постоянно изменяться и пополняться.

Решение.
Используем атрибут SRC эленента IMG для загрузки CGI-ресурса:

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

Для полноты картины приведем и текст HTML-страницы:

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

В этом скрипте, имена файлов заносяться в массив @my_pic, причем для пропуска точек (. и ..) в верхей части директории, выполняется условый оператор в зависимости от значения счетчика (переменная $i).

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

§2. Загрузка CGI-сценариев в контейнере IFRAME.

Основной привлекательностью использования элемента IFRAME является возможность выделения в произвольном месте HTML-страницы прямоугольной области произвольных размеров. Этот прием часто применяется для внедрения в статическую HTML-страницу, новостной, часто меняющейся информации, как текстовой, так и графической. При этом, как правило, новостная вставка, сама представляет собой HTML-страницу (файл). Применение, в качестве загрузочного ресурcа CGI-сценария позволит автоматизировать процедуру смены новостей.

Задача.
Автоматизировать процесс смены новостной информации (текстовой) в поле статической HTML-страницы.

Решение.
CGI программа считывает текстовый файл с диска, или выполняет выборку из базы данных (БД), генерирует на лету документ HTML и загружает ресурс в элемент IFRAME: .

Отметим, что элемент IFRAME представляет собой встроенный элемент Internet Explorer (IE). Начнем рассмотрение с CGI-скрипта:

В процессе загрузки в броузер новостной HTML-страницы, управление передается CGI-скрипту, который считывает обычный текстовый файл bulletin.txt с диска сервера, создает на лету HTML-вставку и выводит ресурс в элемент IFRAME. Для наглядности, HTML-вставка размещена в теле CGI-скрипта. В реальной ситуации, HTML-вставка существует в виде шаблона в каталоге шаблонов на сервере или находиться в таблице шаблонов в БД. Ниже представлена собственно новостная HTML-страница (news.html):

Из этого примера видно (рис.1), что динамически обновляемая информация отделена от статического дизайна, который может модифицироваться дизайнером без ущерба CGI-cкрипту.

Дополнительный элемент ILAYER будет понятен броузеру Netscape Navigator (NN). Ниже представлен простой пример CGI-скрипта, выполняющий единичную выборку новостей из базы данных MySQL:

Отметим, что изменение кода HTML-вставки, выразилось лишь только в замене массива @lines на переменную $news.

Автоматическая выборка новостной информации из БД хороший пример сокращения затрат на содержание сайтов средних и крупных размеров, порталов, интернет-магазинов и.т.п. Редактор новостей корпоративной сети, по мере поступления новостной информации, заносит ее в БД. Дальнейшее распространение и публикация новостей происходит без его участия и без помощи дизайнеров и программистов.

§3. CGI-JavaScript программирование.

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

Задача.
Автоматизировать процесс смены новостной информации (текстовой) в поле статической HTML-страницы и обеспечить при этом сохранение информации об авторских правах на публикацию.

Решение.
В новостной HTML-странице располагается некоторая подпрограмма-функция test_copyright( ) языка JavaScript, ненсущая инфорацию об авторских правах. Выполнение этой подпрогаммы возлагается на сценарий CGI. CGI программа считывает файл новостей с диска, сравнивает информацию об авторских правах с образом copyright и генерирует на лету свой JavaScript скрипт test2( ), который непосредственно и выполняет вывод в окно броузера.

Загрузка CGI ресурса выполняется с помощью атрибута SRC элемента SCRIPT: .

Расссмотрим сначала код HTML-страницы:

Как видим в теле HTML-страницы располагается подпрограмма-функция test_copyright( ). Возвращаемый параметр этой функции содержит copyright. Образ этого copyright находится в одной из переменных сценария CGI:


Функция test2( ) языка JavaScript, размещается в теле CGI-скрипта, а вызывается на выполнение при загрузке HTML-страницы. В процессе выполнения сценария CGI, последний анализирует информацию, возвращаемую подпрограммой-функцией test_copyright( ) и сравнивает ее, с помощью скрипта test2( ), с образом copyright в переменной $param. В зависимости от совпадения или несовпадения образа с copyright, новостная информация публикуется или возвращается ошибка JavaScript. Ошибка JavaScript, равносильная запрету на публикацию, возникает в двух случаях: 1) если вы измените или удалите copyright из тела HTML-страницы, 2) если вы попытаетесь удалить подпрограмму-функцию.

Отметим, что как и прежде, реализуется идеология разделения CGI-программы и дизайна (Рис.2).

Из кода HTML видно, что атрибуты текста новостей могут быть изменены независимо от сценария CGI и независимо от скрипта языка JavaScript. Разумеется, мы здесь представили упрощенный вариант скриптов, преследуя цель наглядности излагаемого материала. Понятно, что техника CGI-JavaScript программирования, позволяет создать весьма изощеренные средства защиты и ограничения доступа.

§4. CGI-Java программирование.

Пожалуй CGI-Java технология является наиболее перспективной и наиболее интересной в области Web-программирования. Несмотря на выросшую популярность языка Java, CGI остается фактическим стандартом взаимодействия в модели клиент/сервер. Непоколибимость CGI объясняется просто. Во-первых протокол HTTP является основным механизмом передачи информации. Этот механизм положен в основу WWW. Во-вторых, это мощность языка Perl, который чаще всего используется в CGI-программировании. Perl изначально задумывался как высокоуровневый кросс-платформенный язык системного программирования [4]. Perl 5 работает практически везде: Unix, Linux, BSD, Windows, .NET, Sun, Macintosh. В Perl поддерживается интерфейс к базам данных SQL и постреляционным СУБД типа Cache’ [5]. При желании в Perl можно написать программу, в которой будет реализован практически весь арсенал приемов объекто-ориентированного программирования [6]. И наконец, в третьих, программе на Java можно передать всю необходимую информацию от CGI-сценария с помощью потоков ввода-вывода. И наоборот, программы на Java сами могут передавать информацию в сценарии CGI, например, можно «заставить» апплет записывать информацию, полученную из формы в файл на диск.

Рассмотрим примеры CGI-Java программирования в рамках обозначенной темы настоящей публикации.

Задача.
Автоматизировать процесс смены новостной информации (текстовой) в поле статической HTML-страницы и обеспечить вывод текта в графическом виде в целях противодействия несанкционированному копированию новостной информации.

Решение.
В новостной HTML-странице располагается контейнерный элемент APPLET, где атрибут CODE задает имя загружаемого ресурса Java-программы (апплета). Java-апплет, в процессе выполнения, с помощью метода DataInputStream( ) создает поток ввода для ресурса CGI-сценария. CGI-сценарий выполняет выборку текстовой информации из SQL БД, построчно форматирует полученный текст и в потоке вывода построчно передает апплету. Апплет с помощью методов paint( ) и dawString( ) также построчно отображает текст в окне броузера в графической форме.

Включение апплета в документ HTML реализуется следующим образом: ,

где codebase — имя каталога, в котором содержится файл cgi_java.class.
Рассмотрим сначала Java-апплет:

В этом апплете, для реализации построчного чтения выходного потока CGI-сценария, мы использовали метод языка Java — readLine( ). Для того, чтобы этот метод работал, необходимо предварительно определить собственно поток DataInputStream(my_buffer), а перед этим для чтения информации из открытого потока ввода, следует сначала создать буффер: my_buffer. В процессе чтения строк, последние заполняют массив text[ ]. Графический вывод строк в броузер обеспечивает метод Paint( ) с помщью оператора g.drawString(text[j], x, y).

CGI программа как всегда лаконична:

Переменные $database, $host, $port, $login и $pass, для доступа и открытия БД, загружаются в сценарий с помощью команды require из модуля globalvar.pm. Длинна строк $my_leng не превышает 64 символов. Образом для выделения подстрок является пробельный символ » «. Циклическое формирование строк и создание стандартного потока вывода, осуществляется всего шестью строками кода. На Java такое трудно реализовать. Зато на Java легко реализуется графическая форма представления текста. Графический вывод текстовой информации, преследует цель противодействовать несанкционированному копированию новостных данных. Чтобы усилить защиту против копирования, текст выводиться на фоне «водяных знаков» — рис. . . Теперь потенциальному взломщику потребуется выполнить копирование экрана, обработку полученного изображения в PhotoShop, преобразование графики в текст с помощью FineReader, редактирование текста (FineReader выполняет распознавание текста не на все 100% ).

Илон Маск рекомендует:  ArcSin - Функция Delphi

В заключение этого раздела приветем код HTML-страницы:

Последний HTML-код показывает независимость CG-Java программы от дизайна (Рис.3).

§5. CGI-Flash программирование.

Появление технологии Flash компании Macromedia в значительной степени преобразило мир Web. Flash, без особой шумихи (что было свойственно распространению в Web языка Java), быстро занял свою нишу и эволюционировал от внешних plug-in к встроенным в броузеры IE и NN и является в настоящее время полноценной частью инструментов Web-дизайна и Web-программирования. Применение Macromedia Flash избавляет от проблемы совместимости между броузерами, Flash одинаково работает как в IE, так и в NN. В Macromedia Flash 5 применяется специальный событийно-управляемый язык, который поддерживает условные переходы, циклы, массивы, функции и классы, которые можно наследовать. Процедуры ввода-вывода данных, как мы увидим ниже, могут быть реализованы с помошью всего лишь одного оператора этого языка.

Задача.
Создать в статической HTML-странице on-line котировщик валюты EUR/USD рынка Forex и обеспечить запрос на обновление информации через каждые N секунд без перезагрузки HTML-страницы. В качестве ресурса котировок валют использовать ресурс партнерского сервера (www.my_partner.com).

Решение.
Создать файл Flash, обеспечивающий прием информации от сценария CGI. CGI-сценарий должен создавать сокет и устанавливать соединение для приема информации от удаленного сервера. Этот сервер содержит ресурс котировок валют рынка Forex (ресурс обновляется каждые 5 секунд). Из полученного ресурса (HTML-страницы) извлечь численные значения спроса (b >

Как мы видим (рис.6), файл Flash finan.swf выводит в HTML-страницу информационную вставку и идеология разделения CGI-программы и дизайна не нарушена.

Программа CGI показана ниже:

Функция socket( ) создает сокет, тип которого определен как потоковый — SOCK_STREAM. После конвертации имени сокета (более удобного представления для сервера), создается соединение с помощью функции connect( ). Предварительно с помощью переменных $host и $file задаются имя сервера и имя ресурса, соответственно. Для передачи данных через сокет используется функция send( ), а для приема данных через сокет — известная процедура: @data= . После закрытия сокета идет разбор принятых данных ресурса simulation.html:

Для разбора HTML-кода используется образ EURUSD, который задается переменной $valuta. Данные относящиеся к спросу (b >Теперь обратимся к Flash. Прежде всего создадим форму с тремя полями ввода — рис.5.

Создадим два слоя и растянем их на 20 кадров. При скорости кадров 8 fps, полное время цикла из 20 кадров составит 2.5 секунды, т.е. этот промежуток времени будет равен половине времени обновления ресурса курса валют. Затем в оконе Text Options (рис.6) зададим имя текстовой переменной Variable равой my_b >

Аналогичную процедуру выполним для создания имен двух других текстовых переменных: my_ask и my-time. Для верхнего слоя (рис.5) откроем окно Frame Actions и займемся программированием:

loadVariablesNum («http://www.mycgi.com/cgi-bin/java_applet/finan.cgi», 0);

Процедура loadVariablesNum загрузит CGI-ресурс, а полученные данные от CGI-скрипта разместит в текстовых переменных: my_b >Нет сомнения, что методы программирования, представленные выше, весьма перспективны и фактически применяются Web-программистами. Здесь сделана попытка систематизации. Привлекательность технологии CGI/JavaScript/Java/Flash, на мой взгляд, обусловлена прежде всего ее взаимодополняемостью. Небезизвестно, что технические прорывы, как правило, возникает именно на стыке моно-технологий. Там где приоритет Perl не оспорим, пишем скрипты на Perl, в тех случаях где лучше подходит Java, целесообразно использовать апплеты и т.д. И все это в рамкам одной задачи.

Литература:

  1. К. Пэтчетт, М. Райт. CGI/Perl: создание программ для Web : Пер. с англ. — К.: Издательская группа BHV, 1999.
  2. Холзнер С. Perl: специальный справочник — СПб: Издательство «Питер», 2000.
  3. Scott Guelich, Shishir Gundavaram, Gunther Birznieks. CGI Programming with Perl , 2nd Edition, July 2000.
  4. Cross-Platform Perl Second Edition by Eric Foster-Johnson IDG Books Worldwide, 2000.
  5. Кречетов Н., Петухова Е., Скворцов В., Умников А., Щукин Б. Постреляционная технология Cache’ для реализации объектных приложений . –М, МИФИ, 2001.
  6. Кристиансен Т., Торкингтон Н. Perl: библиотека программиста — СПб: Издательство «Питер», 2000. — 736 с.

The technical support is rendered by the company «The Web Production».

CGI-программирование и не только

CGI-программирование+ и не только

Программирование для Web-подмастерьев и Web-мастеров

Павлов А. CGI-программирование: учебный курс. СПб, Питер, 2000. — 416 с.

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

В книге 19 разделов (названных автором уроками) и предметный англо-русский указатель. Первую часть книги (уроки 1-7) можно считать введением в CGI-программирование на языке Perl. Она рассчитана главным образом на приступающих к созданию Web-сайтов программистов, имеющих опыт работы на Си-подобном языке. Достаточно подробно и, что немаловажно, последовательно автор знакомит читателя с решением проблем, которые неизбежно возникают при разработке динамического сайта. Читатель освоит программирование на уровне HTTP-запросов и ответов, сможет написать скрипты на Perl для обработки данных HTML-форм, создавать анимационные образы на стороне сервера. Здесь же даются советы по отладке CGI-скриптов, приводятся примеры приложений: многостраничного счетчика, гостевой книги, программы, с помощью которой можно организовать опрос посетителей сайта. Нужно отметить, что перед изучением уроков следует ознакомиться с основами языка Perl, поскольку на нем написана основная масса приведенных в книге программ и фрагментов. К сожалению, несколько справочных страничек, посвященных Perl, не раскрывают его действительной мощи и многообразия, хотя автор как бы исходит из того, что читатель незнаком с этим языком, и настоятельно рекомендует остановить свой выбор именно на нем. Фактически читателю предоставляется возможность судить о языке лишь по авторским программам. Весь материал ориентирован в основном на создание сайта на платформе Unix, но также приведен ряд полезных рекомендаций для разработки скриптов под Win32 с последующим переходом на Unix.

Усложнить изучение материала могут некоторые многостраничные тексты программ, приведенные практически без комментариев. Они потребуют от читателя дополнительных усилий. Если же принять во внимание отсутствие обычно в таких случаях прилагаемого компакт-диска (или хотя бы дискеты) с отлаженными и, главное, работающими демонстрационными примерами из книги, то трудность освоения рассматриваемых в издании тем возрастает.

CGI-интерфейс

Разработка CGI-программ

Самым простым и исторически самым первым способом создания динамических ресурсов для сети Интернет является использование интерфейса CGI.

CGI-интерфейс

Common Gateway Interface (CGI) является стандартом интерфейса внешней прикладной программы с Web сервером. Их взаимодействие иллюстрируется рис.4.1.

Рис. 4.1. Распределение функций между уровнями с использованием интерфейса CGI

Клиентская часть приложения представляет собой HTML-документ, в котором реализован интерфейс с пользователем. Реализуется в основном посредством форм, хотя могут использоваться и другие элементы, в том числе скрипты и апплеты.

Серверная часть состоит из исполняемого модуля, решающего основные задачи обработки данных, поступающих от клиентской части, формирования ответа в формате HTML, и т.д. Такой модуль называется cgi-модулем или расширением сервера.

Сам интерфейс CGI представляет собой правила взаимодействия сервера с внешним по отношению к нему модулем (cgi-модулем). Он определяет 4 информационных потока (рис. 4.2):

· стандартный входной поток;

· стандартный выходной поток;

Рис. 4.2. CGI-интерфейс.

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

Этих переменных достаточно много, они содержат различные данные, в частности:

SERVER_SOFTWARE — содержит информацию о Web-сервере (название/версия);

GATEWAY_INERFACE — содержит информацию о версии CGI(CGI/версия);

CONTENT_LENGTH — значение этой переменной соответствует длине стандартного входного потока в символах;

CONTENT_TYPE — эта переменная специфицирована для запросов содержащих дополнительную информацию, таких как HTTP POST и PUT, и содержит тип данных этой информации;

REQUEST_METHOD — метод запроса, который был использован «POST»,»GET»,»HEAD» и т.д.;


PATH_INFO — значение переменной содержит полученный от клиента виртуальный путь до cgi-модуля;

PATH_TRANSLATED-значение переменной содержит физический путь до cgi-модуля, преобразованный из значения PATH_INFO;

QUERY_STRING — значение этой переменной соответствует строке символов следующей за знаком «?» в URL соответствующему данному запросу;

HTTP_USER_AGENT — название программы просмотра, которую использует клиент при посылке запроса.

Аргументы командной строки. Кроме переменных окружения запускаемой программе передается список параметров, помещаемых в командную строку при запуске. СGI-модуль в командной строке от сервера получает:

· остаток URL после имени cgi-модуля в качестве первого параметра (первый параметр будет пуст, если присутствовало только имя cgi-модуля);

· список ключевых слов в качестве остатка командной строки для скрипта поиска или чередующиеся имена полей формы с добавленным знаком равенства и соответствующих значений переменных.

Стандартный входной поток. Состав данных, направляемых сервером во входной поток СGI-модуля, зависит от использованного клиентом метода запроса.

В случае метода запроса POST данные передаются как содержимое HTTP запроса в следующей форме:

где name — имя переменной,

value — значение переменной,

N — количество переменных

При этом устанавливаются значения переменных окружения CONTENT_LENGTH и CONTENT_TYPE.

Таким образом, если в результате использования формы с аргументом тега FORM — METHOD=»POST» сформирована строка данных firm=МММ&price=100023, то сервер установит значение CONTENT_LENGTH равным 21 и CONTENT_TYPE в application/x-www-form-urlencoded, а в стандартный поток ввода посылается блок данных.

В случае запроса метода GET, строка данных передается как часть URL. Например,

В этом случае переменная окружения QUERY_STRING принимает значение name1=value1&name2=value2, а во входной поток ничего не посылается.

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

Вывод cgi-модуля должен начинаться с заголовка содержащего определенные строки и завершаться двумя символами CR («\n», код 0x10). Эти стоки воспринимаются как директивы серверу. Строки, не являющиеся директивами сервера, посылаются непосредственно клиенту. CGI спецификация определяет три директивы сервера:

Content-type — MIME или тип возвращаемого документа;

Location — указывает серверу, что возвращается не сам документ, а ссылка на него;

*Status — задает серверу HTTP/1.0 строку-статус, в которой кодируется различная информация (например, об успешном завершении операции).

При отправке клиенту HTML-документа директива имеет вид Content-Type:text/html\n\n.

Если будет передан URL, то директива может выглядеть, например, так Location: http://host/file.htm, и сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал этот документ непосредственно.

Обычно CGI–программы размещаются в каталоге со стандартным именем (чаще всего cgi-bin). В этом случае для идентификации достаточно имени файла (без расширения). Ссылка на этот ресурс может выглядеть, например, так: http://www.orp.com/cgi-bin/myscript. Иногда сервер не содержит специального каталога. В этом случае файлы программ могут располагаться в произвольном месте, путь к которому включен в URL. Но при этом необходимо указывать и расширение файла: http://www.orp.com/mucat/myscript.exe. Для некоторых серверов (например, IIS 7) может потребоваться задавать разрешение на выполнение с указанием имени программы.

Использоваться такие ссылки могут в любом атрибуте, допускающем URL (href, src). При этом после самого адреса могут размещаться данные, которые будут переданы серверу вместе с URL. Данные начинаются с символов, следующих за знаком «?», например,
вызов CGI

В этом случае серверу будет отправлена строка /mycgi/cd2.exe?date. Сервер передает эту строку CGI-программе через переменные окружения (в PATH_INFO будет URL, а в QUERY_STRING – строка «date»).

После принятия и расшифровки запроса выполняется динамическое формирование cgi-модулем HTML-документа, например, таблицы выборки из базы данных.

Для формирования ответа клиенту, cgi-модуль должен выдать в стандартный выходной поток заголовок, состоящий из строки:

Content-type: text/html и пустой строки (двух символов CR)

После этого заголовка может следовать любой текст в формате HTML (или другого языка, который может интерпретироваться браузером, например, XML).

У CGI имеется несколько разновидностей, в частности, WinCGI, для которого данные запроса и ответа передаются не через входной поток, а через запись в файлы. Параметры запроса записываются сервером в файл, запускается программа, читает и обрабатывает запрос, записывает ответ в файл (HTML), который сервер направляет клиенту.

Языком написания CGI-программ может быть любой, однако при использовании языков с транслятором интерпретирующего типа (Perl, PHP, VBAScript и др.) сервер должен содержать соответствующий интерпретатор (обычно в виде подключаемого модуля). При использовании языка с транслятором компилирующего типа (Pascal, C++, C#, Java), исполняемый модуль должен создаваться в консольном режиме.

Создать на языке C# программу, выводящую клиенту приветствие в ответ на запрос.

Программирование с использованием CGI

Программирование с использованием CGI

Включение раздела о CGI в книгу по базам данных может показаться столь же странным, как если бы в кулинарную книгу была включена глава о ремонте автомобилей. Разумеется, для того чтобы съездить в магазин за продуктами, нужен исправный автомобиль, но уместно ли об этом говорить? Полное изложение CGI и веб-программирование в целом выходят за рамки данной книги, но краткого введения в эти темы достаточно для того, чтобы расширить возможности MySQL и mSQL по представлению данных в царстве Web.

В основном эта глава предназначена тем, кто изучает базы данных, но не прочь приобрести некоторые знания и в программировании для Web. Если ваша фамилия Бернерс-Ли или Андрессен, вряд ли вы найдете здесь то, чего еще не знаете. Но даже если вы не новичок в CGI, наличие под рукой краткого справочника во время погружения в тайны MySQL и mSQL может оказаться весьма полезным.

Как и большинство акронимов, Common Gateway Interface (CGI — общий шлюзовый интерфейс) мало что говорит по сути. Интерфейс с чем? Где этот шлюз? О какой общности речь? Чтобы ответить на эти вопросы, вернемся немного назад и бросим взгляд на WWW в целом.

Тим Бернерс-Ли, физик, работавший в CERN, придумал Web в 1990 году, хотя план возник еще в 1988. Идея состояла в том, чтобы дать исследователям в области физики элементарных частиц возможность легко и быстро обмениваться мультимедийными данными — текстом, изображениями и звуком — через Интернет. WWW состояла из трех основных частей: HTML, URL и HTTP. HTML — язык форматирования, используемый для представления содержания в Web. URL — это адрес, используемый для получения содержимого в формате HTML (или каком-либо ином) с веб-сервера. И, наконец, HTTP — это язык, который понятен веб-серверу и позволяет клиентам запрашивать у сервера документы.

Возможность пересылки через Интернет информации всех типов явилась революцией, но вскоре была обнаружена и другая возможность. Если можно переслать через Web любой текст, то почему нельзя переслать текст, созданный программой, а не взятый из готового файла? При этом открывается море возможностей. Простой пример: можно использовать программу, выводящую текущее время, так, чтобы читатель видел правильное время при каждом просмотре страницы. Несколько умных голов в National Center for Supercomputing Applications (Национальный центр разработки приложений для суперкомпьютеров -NCSA), которые создавали веб-сервер, такую возможность увидели, и вскоре появился CGI.

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

Если CGI позволяет программам посылать данные клиенту, то формы расширяют эту возможность, позволяя клиенту посылать данные для этой CGI-программы. Теперь пользователь может не только видеть текущее время, но и устанавливать часы! Формы CGI открыли дверь для подлинной интерактивности в мире Web. Распространенные приложения CGI включают в себя:

  • Динамический HTML. Целые сайты могут генерироваться одной CGI-программой.
  • Поисковые механизмы, находящие документы с заданными пользователем словами.
  • Гостевые книги и доски объявлений, в которые пользователи могут добавлять свои сообщения.
  • Бланки заказов.
  • Анкеты.
  • Извлечение информации из размещенной на сервере базы данных.

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

Прежде чем изучать особенности CGI, полезно рассмотреть наиболее часто встречающийся способ, с помощью которого конечные пользователи получают интерфейс к CGI-программам: формы HTML. Формы являются частью языка HTML, предоставляющей конечному пользователю поля различных типов. Данные, вводимые в поля, могут быть пересланы веб-серверу. Поля могут служить для ввода текста или являться кнопками, которые пользователь может нажать или отметить галочкой. Вот пример страницы HTML, содержащей форму:

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

При запуске CGI-скрипта веб-сервер передает ему целый ряд параметров в переменных среды. Часть переменных среды генерируется веб-сервером, а другая часть формируется из полей HTTP-запроса.

В «Спецификации CGI/1.1» описан стандартный набор переменных среды CGI, формируемых веб-сервером, а также способ передачи CGI-скрипту полей HTTP-запроса в переменных среды. Кроме того, ряд веб-серверов (включая Apache) помимо стандартных формируют свои переменные, в которых передают скрипту дополнительные («нестандартные») параметры (E-Mail администратора сервера и т.п.).

Здесь рассмотрены как стандартные переменные среды CGI, так и переменные, формируемые сервером Apache.

Переменные среды CGI на конкретном хостинге.

Чтобы увидеть все доступные CGI-скрипту переменные среды на конкретном сервере, Вы можете запустить на нем CGI-скрипт, выводящий имена и значения всех своих переменных среды:

В зависимости от условий вызова (HTTP-метод, прямой или через SSI…) набор переменных может быть различным, поэтому попробуйте вызывать этот скрипт различными путями и смотрите результаты работы.
Переменные среды CGI, формируемые веб-сервером.

QUERY_STRING — строка параметров вызова (все символы, записанные в URL после знака ‘?’).

REQUEST_METHOD — метод HTTP, с помощью которого вызван скрипт. Чаще всего это методы GET или POST, хотя в принципе могут быть и другие (PUT, DELETE и т.п.).

GATEWAY_INTERFACE — версия интерфейса CGI в виде CGI/x.y. Например, CGI/1.1


REMOTE_ADDR — содержит IP-адрес компьютера, с которого произошло обращение к веб-серверу (адрес клиента либо последнего прокси-сервера).

REMOTE_PORT — TCP-порт удаленного компьютера, с которого идет запрос.

REMOTE_HOST — доменное имя удаленного компьютера, с которого идет запрос (определяется веб-сервером через DNS по значению REMOTE_ADDR, если это разрешено его конфигурацией).

SERVER_NAME — доменное имя сервера.

SERVER_PORT — номер TCP-порта веб-сервера.

SERVER_ADDR — IP-адрес сервера.

SERVER_PROTOCOL — версия HTTP-протокола, используемая для данного HTTP-запроса. Например, HTTP/1.1.

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

SCRIPT_NAME — HTTP-путь к скрипту.

SCRIPT_FILENAME — физический полный путь к скрипту в файловой системе сервера.

PATH_INFO — HTTP-путь к скрипту.

PATH_TRANSLATED — полный физический путь к скрипту.

Если используемый для запроса HTTP-метод предусматривает передачу содержимого в теле запроса, то передаются следующие переменные:

CONTENT_TYPE — тип содержимого (MIME).

CONTENT_LENGTH — длина содержимого

Если произошел аутентифицированный запрос (с указанием имени пользователя и пароля), то передаются переменные:

AUTH_TYPE — тип аутентификации (используемая аутентификационная схема). Чаще всего — ‘Basic’.

REMOTE_USER — имя пользователя, прошедшего аутентификацию.

Если скрипт рассчитан на обслуживание нескольких пользователей, по параметру REMOTE_USER он может их различать. Следует иметь в виду, что если CGI-скрипт уже запущен и ему передан параметр REMOTE_USER, то пользователь УЖЕ успешно прошел аутентификацию на уровне веб-сервера
Переменные CGI-среды Apache

Веб-сервер Apache, в зависимости от версии, может передавать дополнительные переменные, в часности, такие:

DOCUMENT_ROOT — физический путь к корневому WWW-каталогу сервера.

SERVER_ADMIN — E-Mail адрес администратора сервера.

Может использоваться, например, для отправки администратору письма через программу sendmail или в выводе сообщения об ошибке: если ошибка носит непредвиденный характер, скрипт может посоветовать пользователю сайта обратиться к администратору по «такому-то» E-Mail.

SERVER_SIGNATURE — подпись к страницам, сгенерированным сервером (листингам, сообщениям об ошибке). Например: Apache/1.3.3 Server at takoi-to.host.com Port 80

Может использоваться скриптом для «эмуляции» определенной ошибки. Например, если к скрипту обратиться с неправильными параметрами, то можно скрыть сам факт существования такого скрипта, выдав сообщение «Not Found».

Преобразование HTTP-полей запроса в переменные среды

Способ преобразования имен HTTP-полей запроса в имена переменных среды CGI-скрипта следующий:
1. все символы переводятся в верхний регистр;
2. символы ‘-‘ заменяются на ‘_’;
3. в начале имени переменной добавляется ‘HTTP_’.

Таким образом, значение поля HTTP-запроса Connection записывается в переменную среды HTTP_CONNECTION, а значение поля Accept-Language — в переменную HTTP_ACCEPT_LANGUAGE.

Надо сказать, что в большинстве случаев не все поля HTTP-запроса передаются CGI-скрипту.

HTTP_HOST — имя хоста, к которому идет обращение. Удобно, если скрипт обслуживает несколько виртуальных хостов.

HTTP_USER_AGENT — программное обеспечение клиента, сделавшего запрос. Например, Mozilla/4.7 [en] (Win95; I).

HTTP_ACCEPT — список поддерживаемых клиентом типов содержимого (через запятую, в порядке предпочтения).

HTTP_ACCEPT_LANGUAGE — список поддерживаемых браузером языков в виде двухбуквенных наименований (через запятую), например: ru,en. Удобно, если скрипт может выдавать ответы на нескольких языках (скажем, для русскоязычных и англоязычных посетителей сайта).

HTTP_ACCEPT_ENCODING — список поддерживаемых методов сжатия ответа.
Например: gzip,deflate.

HTTP_ACCEPT_CHARSET — список поддерживаемых кодировок текста (через запятую, в порядке предпочтения).

HTTP_CONNECTION — желаемый браузером режим работы соединения: Keep-Alive (после ответа на запрос сервер не разрывает соединения) и Close (сервер разрывает соединение после ответа на запрос).

HTTP_REFERER — значение поля Referer HTTP-запроса. В этом поле браузер передает URL ресурса, по ссылке с которого был запрошен данный ресурс.

Если пользователь переходит по ссылке со страницы A на страницу B, то в поле Referer HTTP-запроса страницы B будет URL страницы A.
*

Для картинок, внешних JavaScript и др. ресурсов, вставляемых в страницу, в поле Referer передается URL страницы, в которую они вставлены.
*

Для ресурсов-скриптов, вставленных через SSI, в переменной HTTP_REFERER передается то же, что и для страницы, куда они вставлены.

HTTP_X_FORWARDED_FOR — если пользователь работает через прокси-сервер, то последний формирует поле X-Forwarded-For, в котором указывает IP-адрес, с которого идет запрос к прокси. Если поле X-Forwarded-Forуже существует в запросе прокси-серверу, то он добавляет к уже существующему полю новое значение через запятую. Таким образом, если клиент работает «каскадно» через несколько прокси-серверов, то первый прокси-сервер создаст поле X-Forwarded-For с IP клиента, а каждый последующий прокси-сервер добавит к уже существующему полю X-Forwarded-For адрес предыдущего прокси через запятую.

Таким образом, можно отследить всю цепочку каскадно включенных прокси- серверов, если, конечно, ни один из них не является «анонимным».

При этом надо иметь в виду, что IP-адрес работающего через прокси клиента может и не принадлежать Интернету, если клиент работает из локальной сети. Обычно для локальных сетей используются адреса вида 172.16.x.y.
Переменные среды, передаваемые CGI-скрипту, вызванному через SSI.

CGI-скрипту, вызванному через SSI, сервером Apache передаются также дополнительные переменные среды:

QUERY_STRING_UNESCAPED — параметры вызова не самого скрипта, а содержащей его веб-страницы. Все escape-последовательности вида %xx уже заменены на символы. В переменной QUERY_STRING, как обычно, передаются параметры вызова самого скрипта в SSI-директиве. Таким образом, CGI-скрипт, вызванный через SSI, может обрабатывать параметры вызова содержащей его HTML-страницы, если они есть.

REQUEST_URI — HTTP-путь к веб-странице, содержащей SSI-директиву вызова скрипта.

DOCUMENT_NAME — имя файла документа (веб-страницы), в которую вставляется результат работы скрипта.

DOCUMENT_URI — HTTP-путь к веб-странице, вызвавшей этот скрипт.

LAST_MODIFIED — дата последнего изменения документа, в который вставлен результат работы этого скрипта.

DATE_LOCAL и DATE_GMT — соответственно местные дата-время и дата-время по Гринвичу.

Для CGI-скриптов, вызванных через SSI, переменная SERVER_PROTOCOL имеет значение ‘INCLUDED’.

Cgi для программиста


Как работает «случайный» URL?

Проще всего, оформить это, как CGI-программу. Сразу, стоит оговориться,
что URL не совсем случайный, он случайный…, но из вашего списка. Формат
списка простой и может пополняться либо в ручную, либо другими программами.


Пример файл LINKS.LST:

CGI-программа на Perl ( rurl.pl ):

Фрагмент вызова программы в HTML-файле:


А как сделать «случайную» картинку?

В принципе, можно использовать программу RURL.PL (см. «Как работает
«случайный» URL?»). Отличия будут только в файле с URL и в способе вызова
программы из HTML-файла.

Пример файл LINKS.LST:

Фрагмент вызова программы в HTML-файле:

Внимание! Этот способ не очень хорошо подходит для демонстрации рекламных
банеров. Хотя, в некоторых случаях можно использовать и эту программу.
: )


Как c помощью CGI-программы показать картинку?

Иногда необходимо выводить картинку ИМЕННО CGI-программой. Как это
сделать? Предположим у нас есть картинка (в директории cgi-bin) — my_lg01.jpg.

Фрагмент CGI-программы (show_img.pl) на Perl:

Вызов из HTML-документа будет выглядеть так:


Иногда требуется удалить из файла все HTML тэги. Как
это сделать?

Можно воспользоваться многочисленными программами конвертирующими HTML
в различные форматы. Можно самому написать маленькую программку.

Фрагмент этой программки можно использовать в CGI-программах для удаления
HTML тэгов (например в Guest Book или Message Board)


Как сделать чтобы банеры, на странице, менялись?

Проще всего воспользоваться такой приятной возможностью многих Web-серверов,
как SSI (Server Side Includes). Сервер, перед тем как послать HTML-документ
пользователью, разбирает его сам и выполняет некоторые «вставки» и только
после этого отдает документ пользователю. Чаще всего, документы с такими
«вставками» имеют тип .shtml , но это не обязательно. Для примера,
я написал простенькую программу случайного выбора банера из списка.

Вызов в HTML-документе:

Вызов из html-файла может осуществляться разными способами. Это зависит
от сервера, его настроек и т.д. Приведу несколько видов вызова.

P.S. Ротацию банеров моджно сделать и для обычного .html, но это слегка
сложнее.


Как сделать счетчик?

Очень простой счетчик можно написать если вы используете SSI (Server
Side Includes) на вашем Web-сервере. Большинство современных серверов поддерживают
SSI и отазываться от этого не стоит, тем более, что в отличии от графически
счетчиков, приведенный ниже, работает несмотря на то, включен у пользователя
«Automatically load images» или нет.

В этом примере я не стал разбирать QUERY_STRING, проверять наличие ключа
в базе и т.д. Но все это наворачивается без особых трудозатрат и вообще
желательно. Все ваши счетчики будут накапливаться в директории /cgi-bin/
— файл counters.pag(.dir) или counters.db. Вызов из HTML-файла:

Для разных серверов этот вызов может варьироваться. Мне известны еще и
такие варианты:

Отзывы:
отзывов пока нет, ваш будет первым!

Cgi для программиста

введение

Взаимодействие между пользовательской интерактивной HTML-страницей (среда браузера, клиент) и сервером обслуживается протоколом CGI. При передаче данных от клиентской формы серверу, последний кодирует входные данные, а сценарий CGI декодирует их, а затем функционально обрабатывает и возвращает выходные данные браузеру.
Судя по литератере, вопросам передачи и обработки данных, включая их запись на диск или в базу данных уделено достаточно много внимания, эти вопросы в той или иной степени затронуты практически в любом руководстве по веб-программированию. Вместе с тем задачи, а в ряде случаев и проблемы, связанные с генерированием выходных данных в среду браузера, освещаются в публикациях и монографиях на уровне фона. Применение же встроенных HTML-функций Perl, в задачу которых входит облегчить генерацию HTML-включений непосредственно из CGI-сценария, приводит к тому, что программист и дизайнер должны выступать в одном лице.
В принципе, самый эффективный (с точки зрения разделения CGI-программирования и HTML-дизайна) способ возврата данных клиенту — это генерация HTML-шаблонов на лету. Шаблон читается CGI-сценарием, который выполняет подстановку переменных вместо параметрических включений и потом на лету генерирует страницу в окне браузера. Самый неэффективный способ — это размещение полных HTML-страниц в теле CGI-скрипта. Любое изменение дизайна HTML-страницы, в последнем случае, потребует модифицировать и CGI-программу в целом. К чему это приводит, думаю знакомо всем веб-программистам. Вместе с тем, как во втором, так и в первом случаях гибкость и опереративность вывода данных оставляет желать лучшего.
В данной статье мы остановимся на некоторых промежуточных вариантах вывода данных, обеспечивающих гибкость и опреративность, смысл которых будет понятен ниже. Представим себе ситуацию, когда в действующую HTML-страницу (файл) потребуется оперативно выводить данные и при этом не затрагивать существующий дизайн. Такими данными могут быть изображения, численные значения счетчиков, ленты новостей, котировки валют on-line, прогнозы погоды и много другое. При этом, в ряде случаев потребуется избавить пользователя от перезагрузки HTML-страницы. На сайтах часто можно встретить предупреждение типа: «Для обновления данных перезагрузите страницу!». Прямолинейным решением может служить перезапись HTML-файлов с помощью CGI-программы, которая предварительно читает файл с диска и изменяет содержимое параметрических включений. Такой подход плох уже тем, что снижает безопасность, открывая доступ каждому (everyone) к записи на диск. Мы рассмотрим другие варианты, а именно, формирование запросов CGI-ресурсов путем использования контейнерных HTML-элементов: APPLET, SCRIPT, OBJECT, IFRAME (ILAYER для Netscape), ну и конечно элемент IMG. С последнего и начнем.

загрузка ресурса IMG

задача
Вы хотите, чтобы на вашей HTML-странице случайным образом загружались бы графические изображения, перечень которых может постоянно изменяться и пополняться.
решение
Используем атрибут SRC эленента IMG для загрузки CGI-ресурса:

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

#!/usr/bin/perl
$path = «c:/apache/htdocs»;
@pic=(‘c0.gif’,’c1.gif’,’c2.gif’,’c3.gif’,’c4.gif’,’c5.gif’,’c6.gif’,’c7.gif’,’c8.gif’);
srand;
$ >$gif=$path.’/images/’.$pic[$id];
print «Content-Type: image/gif\n\n»;
open G,$gif;
binmode( G );
binmode( STDOUT );
print ;
close G;
exit;

Для полноты картины приведем и текст HTML-страницы:

Copyright 2002 The Web Production

TOPText text .

CGI, Программирование CGI-скриптов на Перле

Владивостокский государственный университет экономики и сервиса

Максим Мамаев

Технологии Интернет
Лабораторный практикум

Тема 6. CGI

Литература и ссылки

  • Shishir Gundavaram «CGI Programming on the World Wide Web» — O’Reilly, First Edition, March 1996; ISBN: 1-56592-168-2, 433 pages. .
  • S. Spainhour, V. Quercia «WebMaster in a Nutshell» — O’Reilly, First Edition, October 1996; ISBN: 1-56592-229-8, 356 pages. .
  • Оригинальный сайт проекта Apache
  • Сайт проекта Русский Апач
  • Библиотека Афины, документация по Apache.
  • Библиотека Афины, стандарты RFC по HTTP.
  • Оригинальный сайт языка Perl
  • Библиотека CGI.pm для Perl (документация).

Используемое ПО:

  • Unix (Solaris 2.x),
  • Russian Apache (Apache 1.3.6PL28.16) (распространяется свободно).

  • Язык программирования Perl v. 5.005_03, библиотека CGI.pm и сопутствующие библиотеки (распространяется свободно).
  • Модуль mod_perl v. 1.21 (распространяется свободно).

Интерфейс CGI

Клиент может запросить у веб-сервера как документ-файл с диска, так и документ, динамически формируемый некоторой внешней программой (как правило — в зависимости от данных, предоставленных пользователем при заполнении формы). Интерфейс CGI представляет собой спецификацию взаимодействия веб-сервера и внешней программы, которую веб-сервер запускает для обработки запроса. (Внешняя программа, вне зависимости от своей природы, часто называется CGI-скриптом.)

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

Данные из заполненной клиентом HTML-формы могут передаваться на сервер двумя методами: GET и POST, это определяется параметром method соответствующего тэга . В первом случае (GET) данные присоединяются после вопросительного знака в конец URL, указанной в параметре action, во втором случае — передаются в теле запроса — в секции, предназначенной для данных (следует после всех заголовокв и пустой строки). В обоих случаях данные кодируются одинаково — см. след. пункт.

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

CGI-программа выдает содержимое ответа (как правило, HTML-контент) на свой стандартный вывод, который перехватывается веб-сервером с тем, чтобы отослать эти данные клиенту. Предварительно CGI-программа должна напечатать заголовок «Content-Type» и отделить его от данных пустой строкой. Например, вывод CGI-программы, генерирующей HTML, может выглядеть следующим образом:

Конфигурирование сервера Apache для исполнения CGI-скриптов

Для того, чтобы Apache воспринимал все файлы, находящиеся в некотором каталоге как CGI-скрипты, нужно использовать директиву Это означает, что для обработки запроса URL вида http://your.server.com/cgi-bin/dir/script будет взят не файл script из каталога DocumentRoot/cgi-bin/dir/, а запущена программа /usr/local/www/cgi-bin/dir/script.

Для смешанного хранения файлов, подлежащих просмотру, и CGI-скриптов в одном каталоге внутри дерева DocumentRoot следует присвоить CGI-скриптам одинаковые расширения (например, «.cgi») и указать серверу, что интерпретировать такие файлы следует как CGI-скрипты: Директива AddHandler может быть использована в любом контексте конфигурации Apache.

Структура URL и кодирование данных запроса

Для работы CGI-программ важное значение имеют части URL, называемые PATH_INFO и QUERY_STRING. Рассмотрим запрос с URL вида

Используя директиву ScriptAlias, приведенную в предыдущем пункте, сервер определяет что произошло обращение к CGI-программе и для поиска этой программы заменяет начальное /cgi-bin/ на /usr/local/www/cgi-bin/. Следуя запрошенному URL, сервер обнаруживает в этом каталоге подкаталог dir, однако подкаталога prog в каталоге /usr/local/www/cgi-bin/dir не обнаружено. В таком случае сервер предполагает, что prog — имя CGI-программы, подлежащей выполнению. Если программа /usr/local/www/cgi-bin/dir/prog не найдена или не может быть исполнена, сервер возвращает клиенту ошибку 403, 404 или 500. В противном случае программа prog запускается, а оставшаяся часть пути из URL — /a/b — передается программе prog в переменной окружения PATH_INFO. Таким способом можно передать в CGI-программу дополнительные параметры.

Все, что находится после вопросительного знака — A=1&B=qwerty — передается программе prog в переменной окружения QUERY_STRING. Это могут быть данные из заполненной пользователем формы, отправленные на сервер методом GET, либо какая-то другая информация (сервер не делает никаких предположений об интерпретации данных в QUERY_STRING, это задача вызываемой программы).

Данные из полей формы, заполненной пользователем — независимо от метода (POST или GET), которым они пересылаются на сервер — кодируются следующим образом:

Пары имя-значение разделяются амперсандом. Алфавитно-цифровые символы и некоторые знаки препинания, не имеющие специального значения (тире, подчеркивание) передаются как есть. Остальные символы кодируются в виде «%NM«, где NM — двузначный шестнадцатеричный код символа. Пробел может передаваться как «%20» или как символ «+». Кириллические символы также должны кодироваться указанным способом. Кодировка производится броузером при отправке полей заполненной формы.

Например: означает, что в поле birthday пользователь внес «11/05/73», а в поле name — «John Smith».

Декодирование данных формы является задачей CGI-программы.

При пересылке данных формы, закодированных вышеописанным способом, методом POST клиент должен установить заголовок запроса Content-Type следующим образом:

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

При запуске CGI-скрипта веб-сервер устанавливает дополнительные переменные окружения:

Метод аутентифицирования, использованный для опознания пользователя. См. также REMOTE_USER и REMOTE_IDENT.

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

MIME-тип данных запроса.

Корневой каталог дерева документов веб-сервера (определяется директивой DocumentRoot).

Используемая версия CGI.

Список MIME-типов данных, которые клиент может принять.

Адрес электронной почты пользователя, сделавшего запрос (многие броузеры не передают такие данные).

URL документа, в котором находилась ссылка, вызвавшая настоящий запрос.

Броузер клиента.

PATH_INFO, преобразованное в полный путь в файловой системе сервера (PATH_INFO, добавленное к DOCUMENT_ROOT).

Данные запроса, переданные в составе URL вслед за вопросительным знаком — см. выше «Структура URL и кодирование данных запроса».

IP-адрес клиента.

Метод запроса (GET, POST, HEAD и т.д.).

Номер порта сервера.

Тип и номер версии ПО веб-сервера.

Переменная Значение
AUTH_TYPE
CONTENT_LENGTH
CONTENT_TYPE
DOCUMENT_ROOT
GATEWAY_INTERFACE
HTTP_ACCEPT
HTTP_FROM
HTTP_REFERER
HTTP_USER_AGENT
PATH_INFO PATH_INFO (если есть) — см. выше «Структура URL и кодирование данных запроса»
PATH_TRANSLATED
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST Имя DNS клиента.
REMOTE_USER Аутентифицированное имя пользователя.
REQUEST_METHOD
SCRIPT_NAME Виртуальный путь (например, /cgi-bin/program.pl) к исполняемому CGI-скрипту.
SERVER_NAME DNS-имя сервера или, при невозможности определить имя, его IP-адрес.
SERVER_PORT
SERVER_PROTOCOL Имя и версия протокола, через который был сделан запрос (например, HTTP/1.1).
SERVER_SOFTWARE

С Apache поставляется стандартный тестовый скрипт test-cgi, выводящий занчения переменных окружения CGI.

Cookies и другие методы сохранения состояния

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

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

Существует несколько методов сохранения состояния:

  1. cookies — сохранение на компьютере клиента,
  2. скрытые поля — сохранение внутри формы, посылаемой клиенту,
  3. сохранение в файле какого-либо формата на сервере,
  4. сохранение в параллельно работающей базе данных.

Два последних метода реализуют сохранение состояния на стороне сервера.

В качестве параллельно работающей базы данных может выступать любая из имеющихся СУБД, для обращения к которой язык программирования скрипта имеет интерфейс (в Перле есть библиотеки, обеспечивающие взаимодействие со всеми распространенными СУБД).

Также существует решение в виде демона, который запускается параллельно с http-сервером, и сохраняет требуемую информацию в своей оперативной памяти в виде переменная=значение. Для записи или извлечения данных скрипт соединяется с демоном по заранее оговоренному порту TCP или UDP, идентифицирует себя и использует набор простых команд типа «save name=value» и «extract name» (возвращается value).

Интересно, что несмотря на сложность реализации, такое решение (или использование СУБД с возможностью доступа по сети) позволяет разделять данные между скриптами работающими на различных серверах (если реализуется какая-то сложная распределенная интерактивная веб-система), при этом не вовлекается сохранение данных на стороне пользователя.

Основным недостатком сохранения данных в файле, кроме использования дискового пространства и накладных расходов на файловые операции, является операция записи на диск как таковая. Запись на диск может быть источником серьезных проблем в плане безопасности, так как работа CGI-скрипта фактически управляется воздействием внешних пользователей, которые могут иметь враждебные намерения. Путем посылки каких-либо специальных данных неаккуратно написанному скрипту можно вызвать серьезный сбой в работе сервера. Если же скрипт имеет право записи на диск, то последствия могут быть гораздо серьезнее, поэтому обычно CGI-скрипты, как и сам веб-сервер, работают с минимальными привилегиями от имени пользователя nobody без права записи на диск.

Сохранение состояния на стороне пользователя

Сохранение данных состояния на стороне пользователя (cookies и, технически, скрытые поля) существенный недостаток: пользователь имеет полный доступ к сохраняемым данным и может их несанкционированно изменить (например, прочитать правильный ответ теста или изменить идентификатор пользователя). Достоинством является простая реализация.

Cookies

Cookies — это данные вида имя=значение, которые, будучи получены от сервера, сохраняются броузером на диске пользователя для их возврата серверу при последующих запросах к этому или другому URL. Поскольку данные сохраняются на диске, они могут быть использованы после перезапуска броузера.

Сервер передает cookie через специальное поле заголовка HTTP-ответа «Set-Cookie». Броузер возвращает cookie также через специальное поле в загловке HTTP-запроса — «Cookie». На стороне сервера cookie формируется, как правило, скриптом, который просто выводит в STDOUT соответствующий заголовок. Передача данных, полученных через cookie, от броузера в скрипт производится сервером через установку переменной окружения HTTP_COOKIE, которая доступна внутри скрипта и содержит пары имя=значение, которые броузер передал внутри поля «Cookie» в заголовке своего запроса.

Формат поля Set-Cookie (HTTP-ответ)

Все элементы, кроме имя=значение и Version, не являются обязательными. В заголовке одного ответа сервера может содержаться несколько полей Set-Cookie.


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

Max-Age=секунды устанавливает срок годности данных (в секундах с момента получения cookie); по умолчанию — до окончания работы данного проуесса броузера.

Comment=текстовый_комментарий комментарий сервера по поводу предназначения cookie; предполагается, что пользователь может отказаться работать с этим cookie, если комментарий ему не понравится.

Domain=домен_сервера домен, для которого действительно данное cookie (броузер должен возвращать cookie при обращении ко всем серверам данного домена, с учетом параметра Path [см. ниже]); домен должен начинаться с точки; данный сервер должен находиться в этом домене. Если параметр Domain не указан — возвращать cookie только данному серверу.

Path=URI_или_часть_URI путь от корня дерева документов сервера (URI); броузер должен возвращать cookie при обращении к данному URI и ко всем URI, начинающимся с данного; по умолчанию — URI, при запросе которого было сгенерировано cookie, минус имя файла.

Пример: при обращении на «http://s.vvsu.ru/a/b/c» сервер выдал ответ с установленным полем в заголовке: Это значит, что cookie должно возвращаться броузером при обращении на все URL вида «http://s.vvsu.ru/a/b/какое-то_имя_файла«.
Если же SetCookie в ответе сервера выглядит вот так: то броузер должен присоединять это cookie ко всем запросам URL вида: «http://имя_без_точки.vvsu.ru/a/b/некий_путь_или_никакого«.

Secure если это параметр присутствует, то броузер должен возвращать cookie серверу только через защищенный канал связи; стандарт не специфицирует конкретный механизм защиты данных при передаче, но предполагается, что это SSL.

Формат поля Cookie (HTTP-запрос)

Параметры Path и Domain включаются только если они были установлены в заголовке Set-Cookie. Если несколько cookie удовлетворяют параметру Path, то они указываются в одном заголовке Cookie друг за другом (через точку с запятой) в следующем порядке: первыми передаются cookie с более длинным параметром Path. Порядок следования при равенстве параметров Path не определяется.

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

Когда броузер получает документ с этой формой, содержимое полей типа «h >Недостатком этого метода (кроме указанной выше возможности доступа и изменения данных) является то, что данные сохраняются только во время одного сеанса работы броузера. Если броузер будет перезапущен, все данные будут утеряны и процесс взаимодействия со скриптом начнется с нуля.

Server Side Includes

SSI представляет собой механизм разбора HTML-документов на стороне сервера с целью обнаружения в документе и выполнения директив, добавляющих в документ дополнительную информацию.

Все директивы вставляются внутрь тэгов HTML-комментариев, что позволяет клиенту, в случае, если сервер не поддерживает SSI, игнорировать эти директивы. Директивы имеют следующий формат:

Ниже следует список основных директив SSI и их параметров.

echo Подставляет в документ значение указанной в качестве параметра переменной окружения (см. также список CGI-переменных) или специальной переменной SSI (см. ниже):

include Вставляет в документ текст другого файла. Параметры: file — указывает путь к вставляемому файлу относительно расположения данного документа; virtual — указывает виртуальный путь (как он указывался бы в URL) к вставляемому файлу. Эта директива очень удобна для создания стандартных шапок и подвалов веб-страниц.

fsize Вставляет размер указанного в параметре файла (путь к файлу виртуальный):

flastmod Вставляет в документ дату и время последней модификации указанного в параметре файла (путь к файлу виртуальный): Формат вывода даты и времени может быть специфицирован параметром timefmt директивы config.

exec Выполняет внешнюю программу, указанную параметром, и вставляет вывод этой программы в документ. Параметры: cmd — выполняемая программа является неким обычным приложением; cgi — выполняемая программа является CGI-скриптом В первом примере используется подстановка значений переменных окружения (см. CGI-переменные).

config Модифицирует различные аспекты работы SSI. Параметры:

  • errmsg — сообщение об ошибке, выдаваемое при невозможности выполнить директиву:
  • sizefmt — устанавливает формат вывода размера файла (подставляемого директивой fsize; значения: bytes — выводит в байтах; abbrev — округляет до целого числа килобайт.
  • timefmt — устанавливает формат вывода даты и времени, подробнее см. здесь.

Специальные переменные SSI

Ниже приведены переменные SSI, которые можно использовать в директиве echo в дополнение к переменным CGI.

DOCUMENT_NAME Имя данного документа. Например:

DOCUMENT_URL Виртуальный путь к данному документу. Например:

QUERY_STRING_UNESCAPED Декодированные данные из QUERY_STRING (см «Структура URL и кодирование данных запроса»), при этом все метасимволы шелла экранированы обратным слэшем (\).

DATE_LOCAL Текущие дата и время по местному времени. Например:

DATE_GMT Текущие дата и время по Гринвичу.

LAST_MODIFIED
Дата и время последней модификации данного документа. Например:

Задание

Написать CGI-скрипт для игры в виселицу (угадывание слова по буквам).

Сервер загадывает слово из словаря и показывает его пользователю в замаскированном виде (буквы заменены звездочками). Пользователь имеет некоторое число попыток; во время каждой попытки он может угадать одну букву. Если пользователь правильно угадывает букву или называет букву, которую он уже использовал, попытка не засчитывается. Иначе число попыток уменьшается на единицу.

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

Игра прекращается, если число попыток стало равным нулю (пользователь проиграл) или если угаданы все буквы в слове (пользователь выиграл).

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

Слова выбираются случайным образом из заданного текстового файла.

Соотношение числа попыток и длины слова разумно определяется программистом. Например, число попыток есть заданная функция от длины слова; число попыток жестко привязано к каждому слову в словаре; длина слов в словаре и число попыток являются константами; при определении числа попыток используется заявленный пользователем уровень сложности.

При первом обращении к скрипту выдается заставка и регистрационная форма вида:

При написании скрипта следует непрерывно помнить следующее основное правило CGI-программиста:

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

В связи с вышесказанным требуется решить две проблемы при обработке каждого вновь поступившего запроса (или, что тоже, при каждом запуске программы):

  1. Идентификация пользователя
  2. Получение информации о состоянии игры (слово, использованные буквы, число попыток)

Если такую информацию получить не удается, считается, что это первое обращение пользователя и ему предлагается регистрационная форма.

О методах сохранения состояния в CGI-программировании см. соответствующий раздел выше.

В результате анализа информации о состоянии игры и содержимого заполненной пользователем формы (если таковое имеется в поступившем запросе) программа разветвляется для формирования одного из следующих ответов (HTML-текстов):

  • регистрационная форма,
  • форма попытки,
  • сообщение об окончании игры.

После выдачи сформированного HTML-текста и сохранения (каким-либо способом) нового состояния, программа прекращает свою работу.

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

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

Cgi для программиста

Обработка сервером запроса от клиента (браузера) может состоять в «выдаче» содержимого файла, находящегося по указанному адресу или в инициализации программы (серверного сценарияcgi или asp), которая сгенерирует web-документ в соответствии с запросом (например, сформирует список товаров, отвечающих критерию поиска).
CGI (Common Gateway Interface, общий шлюзовой интерфейс) — это программа, работающая на сервере. (Таковым же является и asp-сценарий. См. раздел «ASP»).

Параметры cgi-скрипт получает через переменные среды окружения (environmental variables).

На каком языке должен быть написан серверный сценарий?

В каком редакторе можно писать сценарии на языке PERL?

Какие web-серверы поддерживают язык PERL?

Как отлаживать cgi-сценарии?

Отлаживать сценарии на языке PERL можно непосредственно на сервере или с помощью компилятора PERL.
Для ОС UNIX — этот компилятор является стандартным приложением, для ОС Windows его необходимо предварительно скачать и установить.
Компилятор PERL под Windows — свободно распространяемый продукт, его можно скачать на сервере фирмы ActiveWare или здесь.

Важно — права доступа!

Переменные среды окружения (environmental variables)

При запуске серверного сценария сервер формирует среду окружения (environment). В этой среде сервер может найти всю необходимую информацию об HTTP-соединении и о параметрах, передаваемых клиентом.

Ниже перечислены стандартные переменные среды окружения (однако, разные web-серверы могут создавать и собственные переменные среды окружения):

REQUEST_METHOD Это одна из самых важных переменных. Протокол HTTP использует для запроса к серверу методы GET и POST. Они указываются в качестве значений атрибута action тэга &ltform&gt , служащего для передачи данных от клиента на сервер.
Метод POST используется при передаче на сервер неопределенного количества данных (в частности, при использовании в форме текстовой области &lttextarea&gt). Сами данные передаются в теле запроса. Cgi-скрипт считывает их из переменной QUERY_STRING .
Метод GET используется при передаче на сервер относительно коротких текстовых строк — они размещаются после знака ? в URL. Тело запроса в этом случае пусто. Cgi-скрипт считывает количество данных из переменной данные из стандартного входного потока (STDIN).
QUERY_STRING Содержимое строки передаваемых данных при использовании метода GET. Следует иметь в виду, что при передаче на сервер данные кодируются браузером (пробелы заменяются символом «+», все специальные символы переводятся в последовательность %hh , где hh — 16-ичный код символа. Разделителем полей является знак «&»). Серверный сценарий декодирует строку QUERY_STRING .
CONTENT_LENGTH Объем вводимых через стандартный входной поток данных (длина тела запроса), в байтах.
CONTENT_TYPE Тип тела запроса (при использовании метода POST):
для передачи текстовых данных этот тип: application/x-www-form-erlencoded ,
для передачи двоичных файлов: multipart/form-data ; для передачи графических файлов: image/x-xbitmap\n\n .
(При использовании метода GET тело запроса пусто).
GATEWAY_INTERFACE Версия протокола (интерфейса) CGI (например, CGI/1.1).
REMOTE_ADDR IP-адрес удаленного хоста, делающего данный запрос.
REMOTE_HOST Доменное имя удаленного хоста, делающего данный запрос, если таковое имеется; в противном случае — то же, что и REMOTE_ADDR .
SCRIPT_NAME Виртуальный адрес скрипта (вместе с именем файла), использованный в запросе. (Физический адрес содержится в переменной SCRIPT_FILENAME .)
SCRIPT_FILENAME Физический адрес скрипта (вместе с именем файла), использованный в запросе. (Виртуальный адрес содержится в переменной SCRIPT_NAME .)
PATH_INFO Виртуальный адрес скрипта (без имени файла), использованный в запросе. (Физический адрес содержится в переменной PATH_TRANSLATED .)
PATH_TRANSLATED Физический адрес скрипта (без имени файла), использованный в запросе. (Виртуальный адрес содержится в переменной PATH_INFO .)
SERVER_NAME Имя сервера: доменное (например, www.microsoft.com) или IP-адрес (157.151.74.254).
SERVER_PORT TCP-порт, используемый для соединения. По умолчанию HTTP-порт имеет номер 80, но он может быть и другим.
SERVER_PROTOCOL Версия протокола сервера (например, HTTP/1.1).
SERVER_SOFTWARE Программное обеспечение сервера (например, Apache/1.0).
AUTH_TYPE В целях защиты информации в WWW можно разрешить доступ к HTML-страницам только по паролю. Переменная AUTH_TYPE содержит тип идентификации пользователя сервером.
REMOTE_USER Имя пользователя.
Переменные заголовка HTTP-запроса
HTTP_ACCEPT Типы данных MIME, которые могут приниматься браузером от web-сервера (например: text/html, text/plain, image/gif ).
HTTP_USER_AGENT Сведения о типе и версии браузера. В соответствии с ними cgi-скрипт может настроить стиль и/или содержимое страницы.
HTTP_HOST Имя хоста, к которому обращается браузер.
HTTP_REFER URL документа, который инициировал cgi-скрипт.
HTTP_ACCEPT_LANGUAGE Предпочтительный язык для получения ответа от web-сервера (хотя то, что ответ будет на этом языке, не гарантируется).
HTTP_UA_OS Дата последнего изменения документа.
HTTP_UA_COLOR Допустимое количество цветов в системе пользователя.
HTTP_UA_CPU Тип центрального процессора удаленного пользователя.
HTTP_UA_PIXELS Разрешение видеадаптера пользователя.

SSI — тоже очень нужная вещь

SSI (Server Side Includes, включения на стороне сервера) — это директивы, вставляемые в HTML-код и служащие для передачи указаний серверу.

SSI позволяют «вставлять» фрагменты одних документов в другие. Конечно, это можно сделать непосредственно в текстовом редакторе, но если, например, в несколько документов вставляется один и тот же фрагмент, к тому же часто изменяемый, использовать SSI-вставки много удобнее.

Сервер интерпретирует SSI-директивы и выполняет соответствующие действия. Использование SSI-вставок позволяет динамически формировать странички в зависимости от различных параметров(например, типа браузера).
Преимущества SSI проявляются тем сильнее, чем больше по объему сайт, имеющий повторяющиеся элементы кода на разных страничках.
Для того, чтобы сервер знал, что страничка не обычная, а содержит SSI-директивы, используется специальное расширение: shtml или shtm. (Вообще-то, конфигурация сервера может быть настроена и на другое расширение, но shtml воспринимается всегда (если только на сервере не отключено применение SSI вообще).)

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

&lt!—#команда параметр=»значение» —&gt

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

Первое преимущество SSI с точки зрения дизайнера заключается в том, что при таком подходе web-мастеру, занимающимуся поддержкой сайта, можно не бояться случайно испортить дизайн. Элементы сложной верстки скрыты за счет использования SSI, и поддержка содержимого страничек становится гораздо более легким и приятным делом. Второе, не менее важное преимущество, — это возможность мгновенной замены дизайна сайта, не требующая переделывания страничек. Для смены дизайна достаточно переписать SSI-вставки, формирующие внешний вид сайта.

Не является ли SSI альтернативой CGI? Скорее, это дополнение (и очень ценное) к CGI, ппедоставляющее web-программисту множество удобств.

Илон Маск рекомендует:  По поводу использования русских букв в cc
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL