Что такое код cgi


Содержание

CGI-скрипты: что это, способы создания

CGI — это аббревиатура от слов Common Gateway Interface. Так называется небольшая программа, которая предлагает надежный способ взаимодействия веб-серверов в браузере, выполняя это способами, которые были невозможны с помощью HTML. Большинство скриптов CGI написаны на Perl. Это обычный язык программирования, который используется для создания сценариев на стороне сервера со стандартным текстовым файлом с расширением (.cgi).

Основные условия работы программы

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

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

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

Кроме того, понадобится программа FTP, которая поставляется с коммерческой версией Pro или бесплатной версией Lite. Любой вариант будет работать до тех пор, пока он загружается в режиме ASCII, чтобы помочь пользователю пройти через установку, так как создание CGI скриптов может занять много времени.

Конфигурация и монтаж

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

Если уже есть сценарий, открытый для использования, путь должен быть правильным, иначе сервер не будет работать. Пока открывается скрипт, проверяют обратную связь относительно любых переменных, которые требуют настройки и комментарии этой строки, начинающиеся с «#».

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

Разрешение для файлов

Существует три типа доступа к данным с тремя разными разрешениями для каждой группы.

Серверы UNIX позволят установить разные уровни доступа. Важно знать, какие разрешения имеет сценарий:

  1. Группа — состоит из добавленных пользователей на сервере. При необходимости будет разрешено удалить их разрешение.
  2. Пользователь — состоит только из владельца файла в группе, это учетная запись хостинга.
  3. Другое — группа состоит из всех других аспектов на сервере.
  4. Чтение — позволяет пользователям читать и понимать данные, указанные в файле.
  5. Write — разрешение на запись позволит пользователям расшифровать и записать новую дату, удалить старые данные из архива.
  6. Execute — разрешение на выполнение, позволит отправлять файл только в том случае, если программа или Upload скрипт CGI exe исполняются. Предварительно убеждаются, что скрипт будет работать до ссылки в режиме общего пользования.

Пример использования Application

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

Имеет легкий вес (с точки зрения использования памяти), что делает его подходящим для обычных сред CGI, и высокий выбор производительности в таких постоянных средах, как FastCGI или mod_perl.

Добавляя PLUG-INS по мере роста потребностей, можно использовать сложные функции, когда они будут нужны, например, нужно написать приложение для поиска через базу данных виджетов. Скрипт экземпляра — это то, что фактически вызывается пользовательским веб-сервером. Это очень маленький простой файл, который просто создает экземпляр пользовательского приложения и вызывает унаследованный метод, run (). Ниже приведено полное описание «widgetview.cgi»:

#!/usr/bin/perl -wuse WidgetView

my $webapp = WidgetView->new()

Как можно видеть, widgetview.cgi просто использует прикладной модуль, который реализует пакет Perl под названием WidgetView.pm.

CGI Application заботится о внедрении методов new () и run (). При этом пользователь никогда не должен вызывать print () для отправки любого вывода в STDOUT. Вместо этого весь вывод возвращается, как скаляр.

CGI — самый значительный вклад в управление состоянием приложения. Все, что необходимо для продвижения приложения вперед, это установить значение параметра формы HTML «rm» в значение «режима выполнения», которое нужно обработать отправкой формы. Это ключ к CGI Application.

Методы сценариев

Используя CGI Application, пользователь получает доступ к целому ряду встроенных методов. Ниже перечислены те, которые, вызываются из скрипта.

Метод new () является конструктором для CGI. Он возвращает ссылку на пакет приложений (класс). Он может принимать набор параметров, как пары: ключ => значение.

Этот метод может принимать некоторые конкретные параметры:

  1. TMPL_PATH — определяет путь к каталогу шаблонов.
  2. QUERY — позволяет указать уже созданный объект запроса CGI.pm.
  3. PARAMS — этот параметр, позволяет установить во время выполнения ряд настраиваемых режимов. Передавая различные значения в сценариях разных экземпляров, которые используют один и тот же модуль приложения, можно достичь более высокого уровня повторного использования.

Run () вызывается на объект Application Module из скрипта. При вызове он выполняет функциональные возможности пользовательского прикладного модуля.

Этот метод сначала определяет состояние приложения, просматривая значение параметра CGI, заданного параметром mode_param (). По умолчанию В «rm» для В «Run Mode», который будет содержать имя режима работы. Если это не указано, состояние по умолчанию равно значению start_mode (). Как только режим определен, run () просматривает таблицу отправки, хранящуюся в run_modes (), и находит указатель функции, который вводится из имени режима. Если найден, функция вызывается, а возвращаемые данные print () ‘ed отправляются в STDOUT и в браузер. Если указанный режим не найден, в таблице run_modes (), run () будет croak ().

Поддержка PSGI

Приложение предлагает встроенную поддержку PSGI. Объектом запроса по умолчанию для этого является:

Самый простой способ — создать и вернуть PSGI — совместимый coderef. Нужно передать аргументы в hashref так же, как и к новому. Это возвращает PSGI-совместимый coderef, используя CGI . PSGI в качестве объекта запроса. Чтобы использовать другой объект запроса, создают собственный объект run_as_psgi(), как показано ниже:

my $psgi_aref = $webapp->run_as_psgi

Точно так же, как run, печать, не выводит и не возвращает структуру данных, требуемую спецификацией PSGI. Используют это, если нужно запустить приложение поверх обработчика, совместимого с PSGI, например, Plack. Конечный результат может выглядеть так:

Спецификация PSGI позволяет возвращать дескриптор файла или ссылку подпрограммы вместо байтовых строк. В режиме PSGI это поддерживается непосредственно CGI Application.

Методы возможного переопределения

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

  1. Настройка(). Этот метод вызывается унаследованным методом конструктора new ().
  2. Метод setup () следует использовать для определения следующего свойства / методов.

Метод setup () может вызывать любой из методов экземпляра пользовательского приложения. Эта функция является хорошим местом для определения свойств, специфичных для приложения, с помощью $ webapp-> param ().

Метод setup () может быть реализован, как изображение ниже:

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

Метод teardown (). Если он реализован, то вызывается автоматически после создания CGI скриптов и запуска приложения. Его можно использовать для очистки после операций. Типичное использование функции teardown () — отключить соединение с базой данных, которое было установлено в функции setup (). Также можно использовать метод teardown () для хранения информации о состоянии приложения на сервере: cgiapp_init ().

Отправка чистых URI для запуска режимов

Современные веб-фреймворки обходятся без ограничений в URI, обеспечивая вместо этого чистые URI:

Чистым URI для описания одного и того же ресурса может быть:

Процесс сопоставления этих URI для запуска режимов называется диспетчеризацией и обрабатывается CGI :: Application :: Dispatch. Дополнительный диспетчер не требуется.

Можно работать над проектом CGI :: Application на рабочем столе или ноутбуке без установки полнофункционального веб-сервера, такого как Apache. Вместо этого устанавливают CGI :: Application :: Server из CPAN. После нескольких минут установки у пользователя будет собственный сервер приложений.

Проводят автоматизированное тестирование. Test :: WWW :: Mechanize :: CGIApp позволяет выполнять функциональное тестирование проекта CGI :: App без запуска веб-сервера. Test :: WWW :: Mechanize можно использовать для проверки приложения через настоящий веб-сервер.

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

Пользовательский контент CGI

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

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

  1. Полная информация о запросе, включая имя/IP удаленного хоста, запрошенный URL и его аргументы, строку запроса (если они есть).
  2. Куки, связанные с запросом.
  3. В случае запроса POST, в результате отправки веб-формы, имена и значения параметров.

Основной пример скрипта PHP

Сценарий должен выполнить процесс, а затем выводить допустимый HTML-код, включая заголовки HTTP. Пример скрипта PHP:

В этом скрипте первая и последняя строки являются HTML-кодом, а предложения PHP заключены в маркеры, затем получают скрипт из браузера, добавляя строку запроса из двух аргументов «data1» и «data2».

Помимо глобальной переменной $ _SERVER в скрипте доступны следующие ассоциативные массивы запуска CGI скриптов:

  1. $ _GET — имена и значения аргументов, переданных серверу в запросе GET.
  2. $ _POST — имена и значения параметров, отправленных на сервер в запросе POST, при отправке формы.
  3. $ _COOKIE — имена и значения файлов cookie, прикрепленных к запросу.
  4. $ _REQUEST — все элементы в $ _GET, $ _POST и $ _COOKIEnpm для запуска php-скриптов с nodejs через cgi. Этот модуль был разработан для deskshell, чтобы обеспечить беспрепятственную обработку сценариев php.

Учитывая, что разработчик получает запрос в nodejs и имеет объект запроса, называемый req, и объект ответа, называемый res, он должен использовать этот модуль, как представлено ниже:

Таким образом запрос на /test.php будет отвечать модулю php для скриптов CGI. Функция paramsForRequest считывает объект запроса и устанавливает правильные переменные среды cgi для запроса. Это предоставляется, как отдельная функция, поэтому при необходимости можно добавлять дополнительные переменные запроса. Функция detectBinary в окнах ищет дополнительный модуль узла «php-bin-win32», который предоставляет переносимый php-файл. Этот код работает для deskshell и в том случае, если необходимо использовать его для каких-либо других целей и дополнительных функциях.

Первая программа

Чтобы написать простую программу CGI в Perl, придерживаясь традиции, используют фразу «привет мир». Здесь она представлена полностью. Сохраняют это в файл с именем «hello» в каталоге cgi-bin и запускают его, указав URL-адрес:localhost/cgi-bin/hello в браузере. Пользователь должен увидеть текст «Hello world» в браузере. Если нет, знакомятся с разделом boxout для отладки программ CGI, чтобы получить помощь в отслеживании проблемы.

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

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

Все программы CGI должны выводить набор заголовков в браузер пользователя. В большинстве случаев единственным заголовком, который нужно будет вернуть, является контент. Это сообщает браузеру, какие данные программа отправляет. В этом примере возвращается простой текст, поэтому тип содержимого был «text/plain».

Обычно возвращают HTML, поэтому тип контента будет «text / html». Нет причин, по которым программа не может вернуть более сложные данные, например PNG («image / png»). Набор заголовков должен быть отделен от фактических данных пустой строкой. Это достигается путем печати двух символов новой строки после финального заголовка CGI скриптов на сервере.Также обращают внимание, что программа записывает свой вывод в STDOUT.

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

Этот скрипт работает по тому же принципу, что и последний, но выдает системное время, используя функцию при разработке CGI скриптов на Perl — «localtime» и печатает это значение. Каждый раз, когда перезагружается скрипт, время будет обновляться. Еще раз этот скрипт выводит обычный текст. Требуется рассмотреть версию, которая возвращает HTML:

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

Если пользователь когда-либо просматривал настройки своего браузера, вероятно, видел флажки или переключатели для включения или отключения Javascript и Java, но никогда не видел их для CGI или PHP. Это потому, что Javascript и Java выполняются браузером (или нет, если пользователь отключит их). Браузер ничего не знает о CGI или PHP. Он просто получает чистый HTML-код после выполнения сценариев на сервере. Встроенный способ создания CGI скриптов — PHP, ColdFusion, ASP, в основном, используется разработчиками, создающим веб-страницы «front end», которые будут обращаться к базам данных «назад», например, клиент/серверные веб-приложения.

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

Что такое CGI скрипт?

23.08.2014, 17:52

php скрипт CGI
Я новичок. Поэтому сильно не ругайтесь, но проблема в следующем. Я описал проблему как для LAMPP.

Что такое CGI?
прочитал вот это: https://ru.wikipedia.org/wiki/CGI черным по русски там написано: а.

Помогите разобраться, что такое CGI Wrap?
Помогите разобраться, что такое CGI Wrap? Я так понял, что это не очень большая штука, которая.


Помогите понять что это такое — /wbmp.cgi
Помогите понять что это такое — /wbmp.cgi?http://host.com/image.php Допустим так, это используется.

что такое скрипт?
Делаю первую в жизни программу перерыл интернет скачал Notepad++, плагин-компелятор а при нажатии.

23.08.2014, 17:56 2

CGI — это специальный интерфейс взаимодействия между PHP и вебсервером.
Очень сильно устаревший, применялся только в начале существования интернета.

Современные интерфейсы — это FastCGI и модули вебсерверов. PHP обычно применяется в виде FastCGI с nginx и модулем с Apache.

23.08.2014, 18:22 [ТС] 3 23.08.2014, 18:30 4

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

Ссылку я дал, можно мышкой щелкнуть по синему подчеркнутому слову в моем предыдущем сообщении.

Библиотека Интернет Индустрии I2R.ru

Малобюджетные сайты.

Продвижение веб-сайта.

Контент и авторское право.

Что такое CGI?

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

Е сли это программа, то она должна иметь любой приемлемый для конкретной операционной системы исполняемый формат. Программы можно писать на чем угодно: C/C++, Pascal, Java, Visual и просто Basic, delphi и т.д.

Е сли это скрипт (сценарий), то на операционной системе, под которой крутиться веб-сервер должен быть соответствующий интерпретатор сценариев: shell, perl, tcl/tk, command.com и т.д.

Г лавное, чтобы средство разарботки CGI программы (скрипта) отвечало следующим требованиям: — позволяют читать из стандартного потока ввода (stdin) — получать значения переменных окружения (environment variables) — выводить в стандартный поток вывода (stdout)

Д ля чего используется CGI:

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

Механизм работы CGI программ

Переменные окружения (environment variables) — переменные, определенные для системы и сервера, на которой будет выполняться CGI. .

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

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

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

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

П ростейший скрипт, выводящий текущую дату: #!/bin/sh echo Content-type: text/html echo echo «

Today is » date echo «

ВАЖНОЕ ЗАМЕЧАНИЕ Основной ошибкой, которую совершают почти все, кто начинает писать 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 «

Вы посылали вот это:

Н о применение метода GET для передачи параметров, содержащих конфиденциальную информацию недопустимо, т.к. в данном случае вся эта информация передается открыто.

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

Пишем счетчик

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

Э та глава руководства будет скорее полезна тем, кому интересен именно механизм работы счетчиков, поскольку все прилагаемые примеры особыми «наворотами» по части настроек, администрения, и т.п. не обладают. Более «навороченые», готовые к эксплуатации счетчики ищите на Altavista, Yahoo и др. поисковых серверах. Или спрашивайте в соответствующих конференциях новостей (relcom.www.users, relcom.www.support; в фидошных эхах ru.internet.*).

2.1 Типы счетчиков

где #command — любая из многочисленных команд понимаемых Web сервером. В данном случае наибольший интерес представляет команда #exec , которая позволяет выполнять программы и подставлять результаты их работы. Анализируемые Web сервером HTML документы называются server-parsed документами.

2.2 Cчетчик посещений работающий как SSI

А лгоритм работы:

  1. Сервер получает от браузера запрос на HTML документ.
  2. Сервер просматривает документ на наличие вызова SSI.
  3. Если такие вызовы обнаружены, то на их место подставляется результат. В случае команды #exec — результат работы программы, указанной в «value» .
  4. Сформированный HTML документ возвращается браузеру.

Н еобходимые настройки сервера (на примере сервера Apache):

  1. В файле srm.conf прописать (если там еще не прописано): AddType text/html .shtml AddHandler server-parsed .shtml Эти директивы говорят серверу, что файлы с раширением .shtml являются server-parsed документами.
  2. В файле access.conf на директорию, где будут лежать server-parsed документы, в Options добавить опцию Includes.
  3. Файлам, содержащим вызовы SSI присвоить расширение .shtml (см. п. 1)

Продемонстрируем работу счетчика на примере скрипта counter , найденного в Интернете на http://www.webtools.org/. Он написан на столь популярном ныне Perl’е.

В от тут будем считать :
(нажимайте Reload пока не надоест)

Э тот счетчик текстовый, т.е. скрипт возвращает просто текст, который и показывается. Аналогичным образом можно выводить и картинки. Для этого нужно, чтоб вместо текстовых цифр выводились тэги img src=»http://www.i2r.ru/static/260/%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0_%D1%81_%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D0%B2%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B9″. Пытливый читатель легко догадается, что количество тегов img src. равно количеству цифр в значении возвращаемом счетчиком.

В ызов этого счетчика в теле документа осуществляется командой:

2.3 Счетчик не использующий SSI

Б олее простым с точки зрения пользователя, но более сложным в программировании является счетчик не использующий SSI. Механизм работы такого счетчика представляет из себя следующее:

  • в теле HTML документа указывается: т.е. запрашиваемая картинка не является статической, а динамически генерируется CGI скриптом.
  • сервер, получив запрос на картинку, запускает скрипт, указанный в src тэга img .
  • скрипт, увеличивает значение счетчика на единицу, генерирует картинку со значением счетчика и возвращает ее браузеру.

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

С крипт ( counter.cgi ), который вызывается в теле HTML документа тэгом img src=»http://www.i2r.ru/static/260/.%20counter.cgi» написан на shell и имеет следующий исходный текст (номера строк добавлены только для упрощения объяснения): 1: #!/bin/sh 2: now=`date -u` 3: echo «Content-type: image/gif;» 4: echo «Expires: $now» 5: echo 6: counter|showdigits

Ч то делает этот скрипт (построковое описание):
1 — Заголовок самого скрипта. Он указывает на командный интерпретатор, который будет его выполнять.

2 — Определяем переменную now , которая содержит время запуска скрипта (время создания картинки). Ключик ‘ -u ‘ говорит, что, дата/время создания выводяться в GMT . Зачем это надо будет описано ниже.

3 — Начинаем формировать заголовок ответа сервера. Указываем тип возвращаемых данных: image/gif

4 — Поскольку это счетчик, то необходимо обеспечить, чтобы картика с его показаниями не кэшировалась (а то какой он после этого счетчик:). Для этого указываем, что полученая браузером картинка должна немедленно заэкспайриться. Вот тут то мы и используем переменную now , определенную в строке номер 2. Употребление Expires в таком виде соответствует стандарту на HTTP протокол версии 1.1. Но при использовании Expires равным дате создания документа могут возникать забавные глюки, если часы на клиенте отстают от часов сервера на несколько минут. Возникает дилемма — по стандарту положено так, а получается не то что надо. Что делать? В предыдущей версии протокола (HTTP 1.0) Expires можно было выставлять равным 0, а RFC2068 гласит, что клиенты и кэши работающие по HTTP 1.1 должны поддерживать старый вариант использования Expires (Expires: 0). Так шта, дорогие россияне, решайте сами.

5 — Конец заголовка ответа — возвращаем пустую строку.

6 — Используя две программы (counter и showdigits) генерим саму картинку.

П рограммы counter и showdigits написаны на Си с использованием библиотеки для работы с GIF файлами — libgd. Без нее программы компилироваться не будут. Последнюю версию библиотеки всегда можно получить на http://www.boutell.com/gd/ .

Ч то делают эти программы:

  • counter — читает из файла counter.rc число, представляющее из себя предыдущее значение счетчика, прибавляет к нему единичку и пишет обратно. Если не указан путь к файлам — картинкам с цифрами и маска этих файлов,то береться дефолтовая, которая определна в теле программы. После этого она вычисленное значение счетчика и пути к картинкам выводяться на stdout, чем формируется коммандная строка для showdigits.
  • showdigits — эта программа, собственно, и формирует картинку с текущим показанием счетчика. Для этого используется набор готовых картинок с цифрами (gif формат, все картинки одинакового размера) и полученные на stdin от counter данные. По пути, маске и числу беруться нужные картинки и из них собирается один гиф. После чего он отправляется прямиком на . stdout ! А далее сервер перенапрявляет этот поток браузеру и он (браузер) показывает его как картинку, поскольку в заголовке ответа указано, что это гиф.

В ся суть здесь вот в чем: — Сервер передает браузеру поток данных. — Браузеру абсолютно все равно, где и как сервер взял передаваемый ему поток данных (статический ли это, или динамически сгенеренный; обычный файл или результат жизнедеятельности скрипта), главное, чтоб браузер знал как его правильно интерпретировать. Для этого служит заголовок, который в данном примере был сгенерирован скриптом counter.cgi , а именно в 3-5 строках (см. выше). Причем, в случае статических файлов сервер сам генерирует этот заголовок, исходя из собственных настроек, а в случае с cgi это должен делать сам скрипт.

Server side includes


3.1 Что такое SSI

где #command — любая из SSI директив понимаемых Web сервером, а » value » — ее параметры.

Подставляемые данные могут быть статическими и динамически генерируемыми. Статические данные уже готовые, записанные в виде файлов, фрагменты текста или HTML. Такие данные удобно применять в случае, когда в различных HTML документах содержаться повторяющиеся фрагменты. Динамически генерируемые данные результаты работы каких-либо CGI скриптов или команд операционной системы, на которой работает конкретный Web-сервер. Использование этого типа данных предоставляет Web-девелоперу огромные возможности. Но, как гласит дебильная российско-буржуйская реклама, — «Не забывай про Орбит без сахара!». То бишь, ПОМНИ О МЕРАХ ПО СОБЛЮДЕНИЮ БЕЗОПАСНОСТИ ДОСТУПА К ИНФОРМАЦИИ! Неправильное использование SSI может привести к появлению возможности несанкционированного доступа к информации и, соответственно, к различным тяжким последствиям. Чтобы уберечься от этого — читайте необходимую литературу. Например, от W3C (master site: http://www.w3.org/Security/Faq/) или одно из его многочисленных. В том числе и на русском: http://private.peterlink.ru/www-security-faq/.

3.2 Основные SSI директивы

CGI скрипту передаются так же значения переменных PATH_INFO и QUERY_STRING оригинального запроса клиента.

cmd сервер выполняет указанную строку, используя командный интерпретатор операционной системы. fsize печатает размер указанного файла с учетом sizefmt . Атрибуты: file указывается путь к файлу относительно текущей директории содержащей анализируемый файл. virtual указывается (%-кодированый) URL-относительный путь к файлу. Если путь не начинается с (/), считается, что путь указан относительно текущего документа. flastmod печатает дату/время последнего изменения указанного файла с учетом timefmt . Атрибуты такие же как у команды fsize . include вставляет текст другого документа или файла в анализируемый документ. Очень полезна при повторяющихся фрагментах в разных документах. Атрибуты: file указывается путь к файлу только относительно текущей директории содержащей анализируемый файл. virtual указывается (%-кодированый) URL-относительный путь к файлу. Если путь не начинается с (/), считается, что путь указан относительно текущего документа. В Apache включаемые таким образом файлы могут быть вложенными. printenv печатает список всех существующих переменных и их значения. Атрибутов нет. Пример:
set устанавливает значение переменной. Атрибуты: var указывается имя устанавливаемой переменной. value указывается значение устанавливаемой переменной. Пример:

3.3 SSI переменные окружения

DOCUMENT_URI — виртуальный путь к файлу Описание в теле документа: Результат использования:

QUERY_STRING_UNESCAPED — раскодированя query string, причем все метасимволы shell предваряются «\» Описание в теле документа: Результат использования:

DATE_LOCAL — текущая дата и время (местное) Описание в теле документа: Результат использования:

DATE_GMT — текущая дата и время (GMT) Описание в теле документа: Результат использования:

LAST_MODIFIED — дата и время последнего изменения файла Описание в теле документа: Результат использования:

3.4 Настройка сервера

Д ля того, чтобы серевер знал, в каком месте в документе подставлять данные, он должен этот документ проанализировать. Анализируемые сервером документы называются server-parsed документами.

В первую очередь надо дать понять серверу, какие документы он должен анализировать. Для этого в файл конигурации (для Apache старых версий и NCSA web-серверов это файл srm.conf , а для новых версий Apache, например 1.3.4 — httpd.conf ), нужно добавить следующие параметры: Сервер Apache: AddType text/html .shtml
AddHandler server-parsed .shtml

AddType text/x-server-parsed-html .shtml Указанные параметры говорят о том, что все файлы с расширением .shtml являются server-parsed , и перед тем как «отдать» этот документ клиенту сервер должен их проанализировать.

Зачем указывать отдельное расширение для server-parsed документов?,- спросит пытливый читатель. Отвечаем. Конечно, никто не мешает добавить в файл конфигурации строку AddType text/x-server-parsed-html .html Однако это приведет к тому, что сервер будет анализировать все документы с расширением .html, даже если в них нет вызова SSI, загрузка системы увеличиться, а производительность сервера снизится.

Не следует забывать и о том, что бесполезно включать вызов SSI в CGI программы, поскольку их вывод сервером не анализируется.

Для получения более детальной информации по конфигурированию вашего сервера на предмет использования SSI читайте документайию на ваш сервер.

Приложения


Приложение 1. Переменные окружения сервера



Н иже приведен список основных переменных окружения сервера с краткими описанием назначения.В данном случае сервер Apache 1.2.5 с модулем PHP/FI-2.0.1. Для других веб-серверов (MS IIS, Netscape, NCSA httpd, и т.д.) переменные могут отличаться.

REMOTE_HOST — имя хоста приконнектившегося к серверу. В случае работы через прокси — имя прокси.
Пример: REMOTE_HOST=lom.pvrr.ru

REMOTE_ADDR — IP адрес хоста приконнектившегося к серверу. В случае работы через прокси — IP адрес прокси.
Пример: REMOTE_ADDR=194.87.186.11

REMOTE_PORT — номер порта клиента.
Пример: REMOTE_PORT=3381

HTTP_USER_AGENT — имя/номер версии/и т.д. клиента (браузера). Использование этой переменной иногда приводит в бешенство отдельных пользователей Интернет.:) Но на самом деле очень полезная вещь. Например для автоопределения русских кодировок.
Пример:HTTP_USER_AGENT=Mozilla/4.07 [en] (X11; I; FreeBSD 2.2.6-RELEASE i386)

HTTP_ACCEPT — типы данных, помимо text/html, воспринимаемые клиентом (браузером)
Пример: HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*

HTTP_ACCEPT_CHARSET — какие чарсеты понимает клиент (браузер).
Пример: HTTP_ACCEPT_CHARSET=iso-8859-1,*,utf-8

HTTP_ACCEPT_LANGUAGE — какие языки воспринимвает клиент (браузер).
Пример: HTTP_ACCEPT_LANGUAGE=nl,nl-BE,ru

SERVER_NAME — имя сервера соответствующее записи IN A в DNS, или значение переменной ServerName (или похожей) в конфиге сервера.
Пример: SERVER_NAME=arche.pvrr.ru

HTTP_HOST — имя сервера или виртуального хоста, к которому обращается клиент. Значение HTTP_HOST может быть равным значению SERVER_NAME.
Пример: HTTP_HOST=www.pvrr.ru

SERVER_SOFTWARE — какое ПО используется в качестве сервера.
Пример: SERVER_SOFTWARE=Apache/1.2.5 PHP/FI-2.0.1

DOCUMENT_ROOT — путь к «корню» веб-сервера от «корня» файловой системы копьютера, на котором он работает.
Пример: DOCUMENT_ROOT=/usr/local/www/html

HTTP_CONNECTION — тип соединения.
Пример: HTTP_CONNECTION=keep-alive

SERVER_PROTOCOL — протокол, используемый для обмена данными с конкретным клиентом.
Пример: SERVER_PROTOCOL=HTTP/1.0

REQUEST_URI — имя запрашиваемого ресурса/документа, включающее в себя путь от корня веб-сервера. При обращении к корню сервера или каталогу этой переменной присваивается имя каталога или «/» в случае корня сервера.
Пример: REQUEST_URI=/cgi-bin/tralala/script.cgi

DOCUMENT_URI — имя запрашиваемого ресурса/документа, включающее в себя путь от корня веб-сервера. Обычно инициализируется при вызове SSI. В отличие от REQUEST_URI эта переменная, в случае обращения к каталогу или корню сервера получает значение содержащее и имя файла, являющегося Directory Index’ом этого каталога.
Пример: DOCUMENT_URI=/tralala/index.shtml

HTTP_REFERER — полный URL документа, по ссылке с которого вы попали на этот сервер. Эту переменную можно использовать при написании счетчиков.
Пример: HTTP_REFERER=http://lom.pvrr.ru/java/cgi/cgi_1.html

GATEWAY_INTERFACE — название/версия интерфейса, через который сервер работает со скриптом.
Пример: GATEWAY_INTERFACE=CGI/1.1

SCRIPT_FILENAME — имя скрипта, содержащее полный путь от «корня» файловой системы.
Пример:SCRIPT_FILENAME=/usr/local/www/cgi-bin/tralala/script.cgi

SCRIPT_NAME — имя скрипта, содержащее путь от «корня» веб-сервера.
Пример: SCRIPT_NAME=/cgi-bin/tralala/script.cgi

REQUEST_METHOD — метод используемый клиентом для передачи данных серверу. Бывают GET, HEAD, POST, PUT.
Пример: REQUEST_METHOD=GET

QUERY_STRING — этой переменной значение присваивается при передаче данных серверу методом GET
Пример: QUERY_STRING=button=on

CONTENT_LENGTH — этой переменной присваивается значение, равное количеству байт, переданных браузером серверу при использовании метода POST.
Пример: CONTENT_LENGTH=9

REMOTE_USER — имя пользователя. Передается только если аутентифицируется доступ к CGI скрипту.

PATH_INFO — дополнительная информация о пути, которую передал клиент. То есть скрипт может получать некоторые параметры, содержащие информауцию о некотором «пути» к некоторым данным (например к файлу конфигурации, необходимому для обработки запроса отименно этого клиента). Этот путь «виртуальный» — т.е от «корня веб-сервера». Остальные данные можно передавать как обычно — методом GET или POST.
Пример: PATH_INFO=/some/path

PATH_TRANSLATED — то же , что и PATH_INFO, только путь физический — «от корня файловой системы»

REMOTE_IDENT — Если HTTP сервер поддерживает идентификацию согласно RFC 931, то этой переменной присваивается имя пользователя получаемое от сервера.

SERVER_ADMIN — e-mail администратора веб-сервера.
Пример: SERVER_ADMIN=webmaster@www.pvrr.ru

SERVER_PORT — порт, который «слушает» веб-сервер.
Пример: SERVER_PORT=80

HTTP_X_FORWARDED_FOR — в случае работы через прокси — IP адрес клиента, работаеющего через прокси.
Пример: HTTP_X_FORWARDED_FOR=194.87.186.11

HTTP_VIA — имя, номер порта, версия ПО прокси-сервера.
Пример: HTTP_VIA=1.0 proxy1.pvrr.ru:8080 (Squid/2.1.PATCH1)

HTTP_CACHE_CONTROL — что-то связанное с возрастом документа в кэше прокси сервера:) Врать не буду — не знаю:)
Пример: HTTP_CACHE_CONTROL=max-age=259200

Переменные среды 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 и ISAPI

Языки JavaScript, VBScript и PerlScript

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

С этой целью был разработан (фирма Netscape Communication Corp., первоначальное название LiveScript) язык JavaScript (не имеющий прямого отношения к Java), язык JavaScript является средством создания активных WEB-страниц непрофессионалами. Фирма MS реализовала в своем броузере MSIE поддержку языка JScript (весьма близкому к JavaScript), давняя приверженность главы MS к Basic’у привела к включению в упомянутый броузер поддержку языка VBScript (по возможностям близкого JavaScript). Так же как и Java, программы на JavaScript и VBScript позволяют не только создавать активные (изменяющиеся предсказанным образом в процессе работы) WEB-страницы, но и снижают поток данных между рабочей станцией и сервером WEB (что благоприятно сказывается на скорости реакции сервера).

Ниже показан HTML-сценарий с встроенным кодом на JavaScript

Динамическое создание WEB-страницы

JavaScript test

Здесь код на JavaScript заключен между тегами и вызывает метод write объекта document, причем метод (по умолчанию) вызывается при загрузке HTML-файла броузером, что приводит к генерации соответствующего текста (и, соответственно, индикации его в окне броузера).

Язык JavaScript позволяет связать вызов конкретной функции с некоторым событием (загрузкой или выгрузкой файла, перемещением указателя ‘мыши’ над заданным участком окна броузера, щелчком кнопки ‘мыши’ над графическим объектом и др.), что позволяет придать WEB-странице определенную ‘интеллектуальность’.

Например, следующий фрагмент HTML-сценария связывает вызов JavaScript-процедуры MakeOnLoad с загрузкой файла в броузер, а процедуры MakeOnUnload — с выгрузкой (например, в связи с переходом к следующей странице).

Следующий пример сценария служит для выдачи окна запроса с двумя кнопками — ‘Ok’ и ‘Cancel’ (при щелчке левой кнопкой ‘мыши’ по выделенному словосочетанию-ссылке ‘Желаете выгрузить’) и совершения некоторого действия (в данном случае выгрузки файла OMD.RAR на компьютер клиента) при положительном ответе

if (confirm(‘Вы действительно желаете выгрузить на свой ‘ +

‘компьютер файл OMD.RAR размером аж 330 kb ?’))

Желаете выгрузить на Ваш компьютер пакет OMD ?

В языке JavaScript определены функции работы с числами, строками, массивами, определения типа броузера, анализа и изменения содержимого WEB-страниц, диалога с пользователем, обработки данных форм (перед отсылкой на сервер), взаимодействия с апплетами Java и др., поддерживается обьектно-ориентированный подход. Для отладки JavaScript-сценариев предлагается отладчик MS Script Debugger.

Язык VBScript в целом обладает сходными с JavaScript возможностями, но имеет Basic-подобный синтаксис и поддерживается только броузером MSIE.

Желающим более подробно ознакомиться с концепциями и языком JavaScript рекомендуются опубликованные работы и ресурсы Сети, некоторые (несложные) конструкции JavaScript можно выгрузить (в составе HTML-сценариев) с сайта автора http://pilger.mgapi.ru. Более серьезные примеры JavaScript-приложений можно получить с адресов

В отличие от Java, коды JavaScript и VBScript практически безопасны с точки зрения совершения несанкционированных действий на компьютере пользователя.

Некоторые WEB-броузеры (например, MSIE версий выше 4) способны интерпретировать встроенный в HTML-код язык PerlScript. Часто вместо создания полномасштабной CGI-программы возможно ограничиться внедрением текста на PerlScript в WEB-страницу (ниже приведен пример простейший HTML-страницы с выводом строки посредством PerlScript-кода).

My first PerlScript example

PerlScript example

Серверные расширения CGI и ISAPI

Серверные расширения CGI (Common Gateway Interface — стандартный шлюзовый интерфейс) и ISAPI (Internet Server API, также NSAPI — Netscape Server API) предназначены для запуска внешних программ под управление WEB-сервера; внешняя программа получает информацию через протокол HTTP от удаленного пользователя, обрабатывают ее (например, осуществляют SQL-запрос к базе данных) и возвращают результат обработки обратно в виде ссылки на существующий HTML-документ или в виде динамически созданной HTML-страницы.

Передача информации от удаленного пользователя происходит следующим образом

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

· Данные поступают на сервер и обрабатываются (возможно, весьма изощренными) приложениями CGI или ISAPI.

· CGI/ISAPI-приложение генерирует (обычно динамически) HTML-документ (файл) и пересылает его обратно удаленному пользователю (где этот документ интерпретируется и визуализируется броузером).

Ниже приведен пример HTML-кода простой формы с двумя полями ввода (имена полей ‘text1’ и ‘text2’) и кнопкой для отсылки сообщений серверу

Образец простейшей формы

На рис.7.12 показано отображение этой формы броузером (хорошо видны два поля ввода и кнопка отсылки введенных в эти поля данных на сервер).

Параметр ACTION описания формы определяет действие, выполняющееся над присланной на сервер информацией (в данном случае указан путь к программе CGI, которая будет выполнять обработку данных). Параметром METHOD выбирается один из двух методов передачи данных серверу WWW — при значении этого параметра GET указанная в параметре ACTION программа CGI получит данные из формы через переменную среды с именем QUERY_STRING, в случае METHOD=POST программа CGI получит данные из формы через стандартный поток ввода stdin.

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

Возможна прямая посылка серверу строки QUERY-STRING в соответствие со следующим URL (через знак вопроса после имени обрабатывающей запрос CGI-программы указывается пересылаемая строка)

При использовании METHOD=GET данные формы поступают на сервер в виде значения переменной среды QUERY_STRING в следующем формате:

Имя1=Значение1&Имя2=Значение2&Имя3=Значение3

Здесь в качестве имен используются значения параметров NAME формы, вместо значений подставляются данные из соответствующих именам полей. Программа CGI должна просканировать содержимое текстовой строки переменной cреды QUERY_STRING и по имени поля найти нужное значение, введенное в это поле пользователем. Адрес заданной строки переменной среды в программе легко получить с помощью C-функции getenv

Передаваемая в переменной среды QUERY_STRING строка закодирована с использованием т.н. кодировки URL (символы пробелов заменяются на символ ‘+’, для представления кодов управляющих и некоторых других символов используется конструкция вида %xx, где хх — шестнадцатиричный код символа в виде двух ASCII-символов); CGI-программа должна выполнить обратную перекодировку.

Рисунок 7.12 — Отображение простейшей формы броузером.

При использовании METHOD=POST программа CGI получает данные из формы через стандартный поток ввода stdin (для чтения удобно использовать С-функции fread или scanf) в аналогичном методу GET формате, причем количество байт в stdin передается CGI-программе через переменную среды с именем CONTENT_LENGTH:

Size = atoi(getenv(«CONTENT_LENGTH»)); // получить длину строки

fread(szBuf, Size, 1, stdin); // прочитать полученные данные

Метод GET применяется относительно редко (длина строки QUERY_STRING ограничена), метод POST более предпочтителен.

Вне зависимости от примененного метода передачи данных (GET или POST) результат своей работы программа CGI должна направлять в стандартный поток вывода stdout (при этом WWW-сервер гарантирует возврат данных броузеру локального компьютера). Ниже приведен пример динамической генерации CGI-программой документа HTML и направления его на stdout

printf(«Content-type: text/html\n\n»); //упрощенный пролог HTML

My first dinamic HTML-page

Результаты обработки данных формы:

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

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

Заметим, что с помощью CGI-программ легко реализуются, например, счетчики числа посещений страниц; в качестве языка программирования CGI-программ часто используют интерпретатор языка Perl (Practical Extraction and Report Language, иногда в шутку Pathologically Eclectic Rubbish Lister, см. InterNet-адреса www.perl.com, http://www.cpan.org, http://orwant.www.media.mit.edu/the_perl_journal, http://www.tpj.com), хотя может быть применен практически любой язык программирования (особенно удо­бен C/C++).

Недостатком приложений CGI является то, что для обработки каждого запроса WWW-сервером он запускает новое CGI-приложение (новый процесс), а т.к. современные сервераодновременно могут обрабатывать много запросов, ресурсы машины-сервера (например, объем оперативной памяти) быстро истощаются (не говоря уже о снижении производительности сервера). От подобного недостатка свободен метод ISAPI, основанный на обработке запросов динамически загружаемыми (из DLL-библиотек) функциями (недостаток — т.к. ISAPI-расширение выполняется в том же адресном пространстве, что и сам WEB-сервер, критическая ошибка ISAPI-приложения обычно вызывает крах сервера). В отличие от CGI, ISAPI-приложение получает данные не из стандартного потока, а с помощью специально предназначенной для этого функции интерфейса ISAPI; вместо стандартного потока вывода также применяется специальная функция.

Некоторые сервера (например, Apache) содержат встроенный Perl, при этом для каждого поступающего CGI-запроса сервер создает новый поток (вместо нового процесса); это значительно ускоряет выполнение CGI-запросов указанным сервером. Для работы под Windows’NT разработаны (см. http://www.activeware.com) пакеты PerlScript (разработка сценариев ActiveX) и PerlIS (динамически вызываемая библиотека ISAPI-интерфейса.

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

При использования метода ISAPI имя соответствующего DLL-файла описывается в параметре ACTION формы (аналогично CGI), также описывается параметр METHOD, однако сами присланные на сервер данные могут быть получены с помощью специально зарезервированных функций GetServerVariable (чтение значений переменных среды) и ReadClient (собственно чтение присланных данных), отсылка же данных (как и при использовании CGI, обычно в виде динамически создаваемых HTML-файлов) производится функциями WriteClient и ServerSupportFunction.

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

Мощным средством для упрощения процесса реализации функциональности и расширения возможностей технологии CGI является язык PHP/FI (Персональные инструментальные средства для Домашней Страницы / Интерпретатор Форм), предложения которого встраиваются непосредственно в текст HTML-страницы и выполняются процессом, инициализированным сервером (обычно Apache). PHP существенно упрощает обработку запросов от форм и анализ SQL-запросов, допускает добавление пользовательских функций (обычно написанных на C). Использование PHP повышает эффективность обработки запросов (CGI-программа не стартует, PHP-код выполняется одним из серверных процессов), при этом повышается уровень защиты данных и конфигурируемость серверного ПО. Первым признаком того, что страница обрабатывается PHP, является добавление нижнего колонтитула с информацией о количестве обращений к данной странице (если программа скомпилирована с опцией регистрации доступа).

Режимы работы PHP

Интерпретатор PHP может работать в нескольких режимах. В этой статье рассматриваются следующие режимы работы:

Каждый из указанных режимов имеет как преимущества, так и недостатки. Те и другие качества в представляем ниже.

Содержание

PHP как модуль Apache (mod_php)

Этот режим предполагает подключение модуля mod_php в настройках веб-сервера Apache. В этом случае каждый процесс веб-сервера будет включать в себя этот модуль. Выбор этого режима особенно подходит для небольших сайтов с малой посещаемостью.

Преимущества:

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

Недостатки:

  • Конфигурирование можно выполнять только через основной файл php.ini и некоторые параметры можно объявить через файл htaccess.
  • По умолчанию скрипты запускаются с правами пользователя apache. Однако это можно изменить путем использования mod_ruid, который позволяет запускать скрипты от разных пользователей.
  • Подгрузка модуля происходит во все процессы apache даже при отсутствии запросов на тип скрипта, обрабатываемый этим модулем. За счет этого создается бесполезная нагрузка на сервер.

  • Скрипт, имеющий ошибки, может привести к сбою работы веб-сервера.
  • Нет простого способа узнать, каким пользователем было запущено стороннее приложение.
  • Некоторые модули имеют проблемы в совместимости с многопоточным запуском веб-сервера (MPM Worker).

PHP в режиме CGI

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

Преимущества:

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

Недостатки:

  • Не высокая производительность.
  • Разработка PHP-авторизации с командой Header имеет ограничения по причине того, что скрипт будет получать не все необходимые серверные переменные.

SuPHP

SuPHP является частным случаем CGI, в котором каждый php скрипт может выполняться с привилегиями разных пользователей.

Преимущества:

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

Недостатки:

  • Сравнительно с CGI более высокая нагрузка на CPU.
  • Недоступны функции кэширования, например, XCache, APC и др.

PHP в режиме FastCGI (mod_fastcgi)

По своим свойствам FastCGI является золотой серединой между mod_php и CGI режимами. В нём исключены недостатки CGI и присутствуют его достоинства. При включенном FastCGI, в ОЗУ сервера располагается постоянно запущенный процесс-обработчик. Это избавляет от необходимости при каждом запросе запускать новый процесс, как в случае использования CGI. По быстродействию FastCGI аналогичен mod_php.

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

Преимущества:

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

Недостатки:

  • Постоянно запущенный процесс интерпретатора создает нагрузку на оперативную память, хотя её объем меньше, чем при использовании PHP как модуля Apache. Это достигается за счет отсутствия необходимости обращения к интерпретатору PHP при выдаче статического содержимого.

LSPHP

LiteSpeed PHP (LSPHP) — реализован в виде модуля mod_lsapi на веб-сервере Apache и является наиболее производительным вариантом запуска PHP на серверах под управлением сPanel.

  • Увеличение скорости обработки PHP-скриптов, что ускоряет работу всего сайта.
  • Отсутствие 500-ой ошибки при наличии php_flag и подобных директив в .htaccess. Актуально при переезде с хостинга, который по умолчанию работал с mod_php.
  • Уменьшится потребление ресурсов в вашем виртуальном контейнере.
  • Улучшится эффективность работы Opcode Cache

На данный момент недостатков не было обнаружено.

Более подробно о работе LSPHP можно прочитать в нашем блоге в статье «Ускорьте работу своего сайта, перейдя на LSPHP».

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

Каким образом узнать текущий режим PHP?

Способ 1. С помощью функции phpinfo()

  • Создаем на хостинге php-файл c произвольным именем (например, info.php), после чего открываем его для редактирования и копируем в него следующие строки:
  • Сохраняем внесенные изменения, после чего открываем файл в браузере.
  • Если все данные были указаны верно, то в браузере будет выведена страница с развернутой информацией об установленном PHP. В перечне выведенных параметров будет присутствовать параметр Server API, в значении которого и отображается текущий режим PHP.
  • На изображении ниже показано значение параметра Server API в случае использования режима FastCGI.


Способ 2. С помощью функции функции php_sapi_name()

  • По аналогии первого способа, создаем на хостинге файл, например, info.php, затем открываем для редактирования и затем копируем следующий код:
  • После сохранения изменений открываем этот файл в браузере. В итоге должна быть отображена страница в теле которой будет выведено название используемого режима PHP. На изображении ниже представлен пример вывода при использовании режима FastCGI.

Уже знаете, какое доменное имя хотите получить для вашего веб-сайта? У нас вы можете купить домен дешево. Нужен хостинг? HOSTiQ предлагает интересные планы виртуального хостинга, а также вы сможете заказать VPS-сервер или арендовать сервер в Европе или США.

Программирование на стороне сервера. Протокол HTTP. CGI. Передача параметров серверу. Запоминание состояния. Меры безопасности. CGI и базы данных

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

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

Работа по протоколу HTTP происходит следующим образом: программа-клиент устанавливает TCP-соединение с сервером (стандартный номер порта-80) и выдает ему HTTP-запрос. Сервер обрабатывает этот запрос и выдает HTTP-ответ клиенту.

Структура HTTP-запроса.HTTP-запрос состоит из заголовка запроса и тела запроса, разделенных пустой строкой. Тело запроса может отсутствовать. Заголовок запроса состоит из главной (первой) строки запроса и последующих строк, уточняющих запрос в главной строке. Последующие строки также могут отсутствовать. Запрос в главной строке состоит из трех частей, разделенных пробелами:

1. Метод (иначе говоря, команда HTTP):

· GET — запрос документа. Наиболее часто употребляемый метод; в HTTP/0.9, говорят, он был единственным.

· HEAD — запрос заголовка документа. Отличается от GET тем, что выдается только заголовок запроса с информацией о документе. Сам документ не выдается.

· POST — этот метод применяется для передачи данных CGI-скриптам. Сами данные следуют в последующих строках запроса в виде параметров.

· PUT — разместить документ на сервере. Используется редко. Запрос с этим методом имеет тело, в котором передается сам документ.

2. Ресурс — это путь к определенному файлу на сервере, который клиент хочет получить (или разместить — для метода PUT). Если ресурс — просто какой-либо файл для считывания, сервер должен по этому запросу выдать его в теле ответа. Если же это путь к какому-либо CGI-скрипту, то сервер запускает скрипт и возвращает результат его выполнения. Кстати, благодаря такой унификации ресурсов для клиента практически безразлично, что он представляет собой на сервере.

3. Версия протокола — версия протокола HTTP, с которой работает клиентская программа.

Таким образом, простейший HTTP-запрос может выглядеть следующим образом:

GET / HTTP/1.0 — запрашивается корневой файл из корневой директории web-сервера.

Строки после главной строки запроса имеют следующий формат: Параметр: значение.

Таким образом задаются параметры запроса. Это является необязательным, все строки после главной строки запроса могут отсутствовать; в этом случае сервер принимает их значение по умолчанию или по результатам предыдущего запроса (при работе в режиме Keep-Alive).

Перечислим некоторые наиболее употребительные параметры HTTP-запроса:

§ Connection (соединение)- может принимать значения Keep-Alive и close.

§ Keep-Alive («оставить в живых») означает, что после выдачи данного документа соединение с сервером не разрывается, и можно выдавать еще запросы. Большинство браузеров работают именно в режиме Keep-Alive, так как он позволяет за одно соединение с сервером «скачать» html-страницу и рисунки к ней. Будучи однажды установленным, режим Keep-Alive сохраняется до первой ошибки или до явного указания в очередном запросе Connection: close.

§ close («закрыть») — соединение закрывается после ответа на данный запрос.

§ User-Agent — значением является «кодовое обозначение» браузера, например: Mozilla/4.0 (compatible; MSIE 5.0; Windows 95; DigExt)

§ Accept — список поддерживаемых браузером типов содержимого в порядке их предпочтения данным браузером, например, для IE5: Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*.Значение этого параметра используется в основном CGI-скриптами для формирования ответа, адаптированного для данного браузера.

§ Referer — URL, с которого перешли на этот ресурс.

§ Host — имя хоста, с которого запрашивается ресурс. Полезно, если на сервере имеется несколько виртуальных серверов под одним IP-адресом. В этом случае имя виртуального сервера определяется по этому полю.

§ Accept-Language — поддерживаемый язык. Имеет значение для сервера, который может выдавать один и тот же документ в разных языковых версиях.

Формат HTTP-ответа.Формат ответа очень похож на формат запроса: он также имеет заголовок и тело, разделенное пустой строкой. Заголовок также состоит из основной строки и строк параметров, но формат основной строки отличается от таковой в заголовке запроса. Основная строка запроса состоит из 3-х полей, разделенных пробелами:

§ Версия протокола — аналогичен соответствующему параметру запроса.

§ Код ошибки — кодовое обозначение «успешности» выполнения запроса. Код 200 означает «все нормально» (OK).

§ Словесное описание ошибки — «расшифровка» предыдущего кода. Например, для 200 это OK, для 500 — Internal Server Error.

Наиболее употребительные параметры http-ответа:

§ Connection — аналогичен соответствующему параметру запроса. Если сервер не поддерживает Keep-Alive (есть и такие), то значение Connection в ответе всегда close.

§ Content-Type («тип содержимого») — содержит обозначение типа содержимого ответа.

§ В зависимости от значения Content-Type браузер воспринимает ответ как HTML-страницу, картинку gif или jpeg, как файл, который надо сохранить на диске, или как что-либо еще и предпринимает соответствующие действия. Значение Content-Type для браузера аналогично значению расширения файла для Windows.

Некоторые типы содержимого:

¨ text/html — текст в формате HTML (веб-страница);

¨ text/plain — простой текст (аналогичен «блокнотовскому»);

¨ image/jpeg — картинка в формате JPEG;

¨ image/gif — то же, в формате GIF;

¨ application/octet-stream — поток «октетов» (т.е. просто байт) для записи на диск.

§ Content-Length («длина содержимого») — длина содержимого ответа в байтах.

§ Last-Modified («Модифицирован в последний раз») — дата последнего изменения документа.

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

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

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

§ Динамический HTML. Целые сайты могут генерироваться одной CGI-программой.

§ Поисковые механизмы, находящие документы с заданными пользователем словами.

§ Гостевые книги и доски объявлений, в которые пользователи могут добавлять свои сообщения.

§ Извлечение информации из размещенной на сервере базы данных.

Все они дают возможность соединения CGI с базой данных, что нас особенно интересует.

Итак, что в точности представляет собой «набор правил», позволяющий CGI-программе, скажем, в Батавии, штат Иллинойс, обмениваться данными с веб-броузером во Внешней Монголии? Официальную спецификацию CGI наряду с массой других сведений о CGI можно найти на сервере NCSA по адресу http://hoohoo.ncsa.uiuc.edu/cgi/.

Есть четыре способа, которыми CGI передает данные между CGI-программой и веб-сервером, а следовательно, и клиентом Web:

§ Стандартное устройство ввода.

§ Стандартное устройство вывода.

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

Эти данные приводятся с прикидкой на сервер HTTP Apache. Apache — наиболее распространенный веб-сервер, работающий практически на любой платформе, включая Windows 9х и Windows NT. Однако они могут быть применимы ко всем HTTP-серверам, поддерживающим CGI. Некоторые патентованные серверы, например, от Microsoft и Netscape, могут иметь дополнительные функции или работать несколько иначе. Поскольку лицо Web продолжает изменяться с невероятной скоростью, стандарты все еще развиваются, и в будущем, несомненно, произойдут изменения. Однако, технология CGI представляется устоявшейся — расплачиваться за это приходится тем, что другие технологии, такие как апплеты, ее потеснили. Все CGI-программы, которые вы напишете, используя эти сведения, почти наверное смогут работать еще долгие годы на большинстве веб-серверов.

Когда CGI-программа вызывается посредством формы — наиболее распространенного интерфейса, броузер передает серверу длинную строку, в начале которой стоит путь к CGI-программе и ее имя. Затем следуют различные другие данные, которые называются информацией пути и передаются CGI-программе через переменную окружения PATH_INFO (табл. 2-1). После информации пути следует символ «?», а за ним — данные формы, которые посылаются серверу с помощью метода HTTP GET. Эти данные становятся доступными CGI-программе через переменную окружения QUERY_STRING. Любые данные, которые страница посылает с использованием метода HTTP POST, который используется чаще всего, будут переданы CGI-программе через стандартное устройство ввода. Типичная строка, которую может получить сервер от броузера, показана в табл. 3-1. Программа с именем formread в каталоге cgi-bin вызывается сервером с дополнительной информацией пути extra/information и данными запроса choice=help — по-видимому, как часть исходного URL. Наконец, данные самой формы (текст «CGI programming» в поле «keywords») пересылаются через метод HTTP POST.

Таблица 2-1. Части строки, переданной броузером серверу

http://www.myserver.com/cgi-bin /formread /extra/information ?choice=help
название программы информация о пути строка запроса

Когда сервер выполняет CGI-программу, то прежде всего передает ей некоторые данные для работы в виде переменных окружения. В спецификации официально определены семнадцать переменных, но неофициально используется значительно больше — с помощью описыва­емого ниже механизма, называемого HTTP_mechanism. CGI-программа имеет доступ к этим переменным так же, как и к любым переменным среды командного процессора при запуске из командной строки. В сценарии командного процессора, например, к переменной окруже­ния FOO можно обращаться как $FOO; в Perl это обращение выглядит, как $ENV<'FOO'>; в С — getenv(«FOO»); и т. д. В таблице 2-2 перечислены переменные, которые всегда устанавливаются сервером — хотя бы и в значение null. Помимо этих переменных данные, возвращаемые клиентом в заголовке запроса, присваиваются переменным вида HTTP_FOO, где FOO — имя заголовка. Например, большинство веб-броузеров включает данные о версии в заголовок с именем USER_AGENT . Ваша CGI-программа может получить эти данные из переменной HTTP_USER_AGENT .

Таблица 2-2. Переменные окружения CGI

Переменная окружения Описание
CONTENT LENGTH Длина данных, переданных методами POST или PUT, в байтах
CONTENT_TYPE Тип MIME данных, присоединенных с помощью методов POST или PUT.
GATEWAY_INTERFACE Номер версии спецификации CGI, поддержива­емой сервером.
PATH_INFO Дополнительная информация пути, переданная клиентом. Например, для запроса http://www.myserver.com/test.cgi/this/is/a/ path?field=green значением переменной РАTH_INFO будет /this/is/a/path.
PATH_TRANSLATED То же, что PATH_INFO, но сервер производит всю возможную трансляцию, например, расширение имен типа «

account».

QUERY_STRING Все данные, следующие за символом «?» в URL. Это также данные, передаваемые, когда REQUEST_METOD формы есть GEТ.
REMOTE_ADDR IP-адрес клиента, делающего запрос.
REMOTE_HOST Имя узла машины клиента, если оно доступно.
REMOTE_IDENT Если веб-сервер и клиент поддерживают идентификацию типа identd, то это имя пользователя учетной записи, которая делает запрос.
REQUEST_METHOD Метод, используемый клиентом для запроса. Для CGI-программ, которые мы собираемся создавать, это обычно будет POST или GET.
SCRIPT_NAME Путь к выполняемому сценарию, указанный клиентом. Может использоваться при ссылке URL на самого себя, и для того, чтобы сценарии, ссылки на которые существуют в разных мес­тах, могли выполняться по-разному в зависимости от места.
SERVER_NAME Имя узла — или IP-адрес, если имя недоступно, машины, на которой выполняется веб-сервер.
SERVER_PORT Номер порта, используемого веб-сервером.
SERVER_PROTOCOL Протокол, используемый клиентом для связи с сервером. В нашем случае этот протокол почти всегда HTTP.
SERVER_SOFTWARE Данные о версии веб-сервера, выполняющего CGI-программу.

Приведем пример сценария CGI на Perl, который выводит все переменные окружения, установленные сервером, а также все унаследованные переменные, установленные командным процессором, запустившим сервер.

Листинг 2.1. Вывод значений переменных окружения.

Системное программное обеспечение

7.1 Что такое MIME?

MIME означает «Multipurpose Internet Mail Extensions» (Многоцелевые расширения почтового стандарта Internet). Этот стандарт описывает, как пересылать по электронной почте исполняемые, графические, мультимедийные, смешанные данные. Типичные применения MIME — пересылка графических изображений, аудио, документов Word, программ и даже просто текстовых файлов, то есть, когда важно, чтобы входе пересылки не производилось никаких преобразований над данными. MIME также позволяет размечать письмо на части различных типов так, чтобы получатель (почтовая программа) мог определить, что делать с каждой из частей письма.

Хотя формат первоначально создан для электронной почты, он также используется для службы WWW.

7.2 Для чего это нужно?

Так как файлы могут быть разными (.gif, .doc, .pdf . ), браузер должен понимать, что с ними делать. Эту проблему решает стандарт «MIME — типы». Он сообщает клиенту, какой тип файлов получен, например:
Content-type: image/gif (графика GIF)
Content-type: image/jpeg (графика JPG)

7.3 Как это работает?

Браузеры используют MIME-типы в своих HTTP-заголовках Accept для того, чтобы сообщить, в каких форматах они предпочитают принимать данные (если сервер может выдать файл в разных форматах). Серверы используют MIME-типы в HTTP-заголовках Content-Type, чтобы сообщить клиенту о том, в каком формате передается прилагаемое содержимое: то ли это HTML, который нужно форматировать, то ли это GIF или JPEG, требующий визуализации, то ли это данные в формате PDF, для которого нужно открывать внешнюю программу просмотра или использовать дополнительное приложение.

Формат MIME-типа — тип/подтип. Можно использовать символ *; например, следующий заголовок клиента означает, что принимаются документы во всех форматах:

Следующий заголовок клиента означает, что принимаются все типы формата text независимо от подтипа:

Серверы должны проверять данные о принимаемых типах, содержащиеся в заголовке Accept, и по возможности выдавать данные соответствующего типа. Большинство серверов определяют формат документа по расширению имени файла. Например, файлы с расширениями .htm и .html — это файлы в формате HTML, поэтому сервер посылает такой документ с типом text/html в заголовке Content-Type, пример:

Действия клиента при получении файла:

При получении клиентом файла, анализируется HTTP заголовок, если в нем находится Content-Type, то клиент производит действие с файлом, учитывая эту информацию.

Если записи нет, то клиент использует свой список MIME-типов, в котором тип определяется по расширению имени файла.


Если тип в файле не найден, то клиент не знает что делать с этим файлом. Браузер в таком случае предлагает вам выбрать сами программу, которой надо передать файл.

7.4 Некоторые основные типы и подтипы MIME.

Первый стандарт — RFC1341 MIME (Multipurpose Internet Mail Extensions): Mechanisms for Specifying and Describing the Format of Internet Message Bodies N. Borenstein, N. Freed June 1992

Последняя версия (состоит из четырех частей) :

RFC2049 (Multipurpose Internet Mail Extensions (MIME) Part Five: Conformance Criteria and Examples N. Freed, N. Borenstein November 1996)

RFC2048 (Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures N. Freed, J. Klensin, J. Postel November 1996)

RFC2047 (MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text K. Moore November 1996)

RFC2046 (Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types N. Freed, N. Borenstein November 1996)

RFC2045 (Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies N. Freed, N. Borenstein November 1996)

Text – текстовые типы.

Тип ‘text’ предназначен для пересылки текстовых материалов. Для обозначения языковой кодировки текста используется параметр «charset» для некоторых подтипов, включая подтип, «text/html», соответствующий простому (неформатированному) тексту.

Content-Type: text/html; charset=windows-1251

Основные подтипы:
Content-Type: text/html — html текст.
Content-Type: text/plain — простой текст.
Content-Type: text/x-server-parsed-html — файл созданный с помощью SSI
Content-Type: text/css — файл содержащий стили — css

Multipart — данные состоят из несколько частей разных типов.

Основные подтипы:
Content-Type: multipart/mixed — несколько частей разных типов (используется в e-mail)
Content-Type: multipart/alternative — одна из частей (используется в e-mail)
Content-Type: multipart/x-mixed-replace — после загрузки следующая часть заменяет предыдущею (используется в анимации)

Message — инкапсулированное почтовое сообщение (используется в e-mail)

Image — графические типы.

Основные подтипы:
Content-Type: image/gif — изображение gif.
Content-Type: image/jpeg — изображение jpeg.
Content-Type: image/tiff — изображение tiff.
Content-Type: image/bmp — изображение bmp

Audio — звуковые типы.

Основные подтипы:
Content-Type: audio/wav — звук в формате wav.
Content-Type: audio/midi — звук в формате midi
Content-Type: audio/mpeg — звук в формате mp3.
Content-Type: audio/vqf — звук в формате vqf
Content-Type: audio/x-pn-realaudio — звук в формате ram rm
Content-Type: audio/x-realaudio — звук в формате ra
Content-Type: audio/x-wav — звук в формате wav

Основные подтипы:
Content-Type: video/avi — видео в формате avi.
Content-Type: video/mpeg — видео в формате mpeg.

Application — представляет данные какого-нибудь приложения.

application/msword – приняв такое сообщение, браузер запустит MS Word для открытия этих данных. Если в системе нет MS Word, то браузер попросит сохранить данные в файле имя файла может находиться в параметре name. Например:

Content-Type: application/msword; name=”Mydoc.doc”

Основные подтипы:
Content-Type: application/msword — программа MS Word
Content-Type: application/pdf — программа Acrobat Reader
Content-Type: application/rtf — программа MS Word
Content-Type: application/zip — разархиватор ZIP-архивов

7.5 Серверные приложения.

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

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

7.5.1 Методы использования серверных приложений.

Запуск через CGI-шлюз. Эти приложения могут быть написаны на любых языках.
Преимущества:
— используются обычные программы (в случае Windows .bat, .exe и тд.)
— стандартизовано
Недостатки:
— при каждом вызове программы происходит ее запуск, что не есть быстро, и при большом количестве запросов, появляется много запущенных программ.

Приложения, встроенные в сервер HTTP, как модули. Как правило, написанные на С.
Преимущества:
— быстрота (т.к. всегда работает, не нужен запуск).
Недостатки:
— необходимость писать модуль для конкретного сервера HTTP.

Приложения, работающие через модули-шлюзы встроенные в сервер HTTP.
Преимущества:
— шлюз написан для конкретного приложения (например, для СУБД MySQL)
Недостатки:
— необходимость писать модул-шлюз для конкретного приложения.

Приложения, написанные на скриптовых языках (SSI, PERL, PHP, ASP и др.), для выполнения которых должны быть встроенные интерпретаторы, как модули сервера HTTP. Код этих приложений встраивается непосредственно в HTML страницы. Сервер распознает эти страницы по расширению (.php, .asp, .shtml, .pl).
Преимущества:
— быстрота (выше чем у CGI, но ниже чем у модуля, т.к. интерпретаторы).
— удобно использовать
Недостатки:
— ограниченность возможностей

Приложения, работающие через Java Servlet.
Преимущества:
— платформо-независимость
— серверо-независимость
Недостатки:
— приложения на Java работаю медленнее

Приложения, написанные на Java и встроенные в HTML страницы (с расширением .JSP (JavaServer Pages)). В принципе это аналог скриптовых языков работающих через модуль (в место модуля в данном случае Java Servlet, а язык Java)
Преимущества:
— платформо-независимость
— серверо-независимость
— удобно использовать
Недостатки:
— приложения на Java работаю медленнее

7.5.2 Архитектура WWW сервера с учетом серверных приложений

Архитектура современного WWW сервера. На выходе с сервера всегда HTML, но сгенерированный приложением.

7.5.3 Примеры запросов к приложениям

В результате через CGI шлюз

Будет запущено приложение search.cgi

и будет передан запрос «text=сотрудники» приложению search.cgi

Приложение search.cgi вернет результат работы CGI-шлюзу

Будет передан запрос «text=сотрудники» интерпретатору PHP.

Интерпретатор будет выполнять команды search.php.

Интерпретатор вернет результат работы WWW-серверу.

Common Gateway Interface — стандарт для обмена данными между сервером и прикладной программой, которая запускается из-под сервера.

7.6.1 Механизмы обмена данными

Механизм можно разделить на четыре части:

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

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

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

GATEWAY_INTERFACE — определяет версию протокола CGI.

SERVER_PROTOCOL — протокол сервера.

SERVER_SOFTWARE — версия сервера.

SERVER_PORT — определяет порт, по которому осуществляется взаимодействие.

REQUEST_METHOD — определяет метод, значения GET, POST, HEAD и т. п.

PATH_INFO — передает программе путь с переменными, часть URL переданный клиентом (т.е. относительный путь с переменными).

PATH_TRANSLATED — абсолютный путь, путь расположения программы на диске сервера.
Пример для запроса http://ipm.kstu.ru/cgi-bin/search?text=ipm:
PATH_INFO = «/cgi-bin/search?text=ipm»
PATH_TRANSLATED = «/usr/local/etc/httpd/cgi-bin/search».

SCRIPT_NAME — относительный путь без переменных.
Пример для запроса http://ipm.kstu.ru/cgi-bin/search?text=ipm:
PATH_INFO = «/cgi-bin/search?text=ipm»
SCRIPT_NAME = «/cgi-bin/search»

QUERY_STRING — переменная определяет содержание запроса к скрипту (все что после ?).
Пример для запроса http://ipm.kstu.ru/cgi-bin/search?text=ipm:
QUERY_STRING —— «text=ipm»

Идентификация пользователя и его машины:

REMOTE_HOST — доменный адрес машины клиента.

REMOTE_ADDR — IP-адрес машины клиента.

AUTH_TYPE — тип идентификации пользователя.

REMOTE_USER — используется для идентификации пользователя.

REMOTE_IDENT — данная переменная порождается сервером, если он поддерживает идентификацию пользователя по протоколу RFC-931. Рекомендовано использование этой переменной для первоначального использования скрипта.

Тип и длина передаваемой информации от клиента к серверу.

CONTENT_TYPE — определяет MIME-тип данных.

CONTENT_LENGTH — определяет размер данных в байтах.

Переменные заголовка HTTP.

HTTP_ACCEPT — поле ACCEPT.

HTTP_USER_AGENT — поле USER-AGENT.

HTTP_HOST — поле HOST.

7.6.1.2 Командная строка

Командная строка используется только при запросах типа ISIN-DEX.

Что такое общий интерфейс шлюза (CGI)?

CGI — это общий интерфейс шлюза. Как говорится в названии, это «общий» интерфейс шлюза для всего. Это так тривиально и наивно от имени. Я чувствую, что понял это, и я чувствовал это каждый раз, когда сталкивался с этим словом. Но, честно говоря, я этого не сделал. Я все еще смущен.

Я программист PHP с опытом веб-разработки.

пользовательский (клиентский) запрос для страницы — > веб-сервер (- > встроенный PHP интерпретатор) —- > Серверная сторона (PHP) Script — > Сервер MySQL.

Теперь скажите, что мой PHP Script может извлекать результаты из сервера MySQL и сервера MATLAB и некоторого другого сервера.

Итак, теперь PHP Script является CGI? Потому что его интерфейс для веб-сервера и всех других серверов? Я не знаю. Иногда они называют CGI, технологию и другие времена, когда они называют CGI программой или другим сервером.

В чем дело с /cgi-bin/*.cgi ? Что с этим? Я не знаю, что это за каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения *.cgi.

Почему Perl всегда мешает. CGI и Perl (язык). Я также не знаю, что с этими двумя. Почти все время я слушаю эти два в комбинации «CGI и Perl». Эта книга — еще один отличный пример Программирование CGI с Perl. Почему бы не «Программирование CGI с помощью PHP/JSP/ASP»? Я никогда не видел таких вещей.

Программирование CGI в C меня смущает. » в C«?? Шутки в сторону?? Я не знаю, что сказать. Я просто смущен. » в C«?? Это меняет все. Программа должна быть скомпилирована и выполнена. Это полностью меняет взгляд на веб-программирование. Когда я компилирую? Как программа запускается (потому что это будет машинный код, поэтому он должен выполняться как независимый процесс). Как он взаимодействует с веб-сервером? IPC? и взаимодействовать со всеми серверами (в моем примере MATLAB и MySQL) с использованием программирования сокетов? Я потерян!


Люди говорят, что CGI устарел и больше не используется. Это так? Какое последнее обновление?

Однажды я столкнулся с ситуацией, когда я должен был предоставить доступ к HTTP PUT-запросу веб-сервер (Apache HTTPD). Его длинный назад. Итак, насколько я помню, это что я сделал:

Отредактирован файл конфигурации Apache HTTPD, чтобы сообщить веб-серверу пройти все запросы HTTP PUT к некоторым put.php (мне пришлось написать этот PHP скрипт)

Реализовать put.php для обработки запроса (сохранить файл в папку упоминается)

Люди сказали, что я написал CGI Script. Серьезно, я понятия не имел, что они говорили.

  • Я действительно писал CGI Script?

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

EDIT:

Я нашел этот удивительный учебник «Программирование CGI просто!» — Учебное пособие по CGI, в котором объясняются концепции в простейшем возможном пути. После прочтения этой статьи вы можете прочитать Начало работы с CGI Programming в C, чтобы дополнить ваше понимание фактическими образцами кода. Я также добавил эти ссылки в этот учебник к статье в Википедии: http://en.wikipedia.org/wiki/Common_Gateway_Interface

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

user (client) request for page — webserver —[CGI]— Server side Program — MySQL Server.

В большинстве случаев, если не все, веб-серверы могут быть настроены для выполнения программы как «CGI». Это означает, что веб-сервер после получения запроса пересылает данные в определенную программу, устанавливает некоторые переменные среды и сортирует параметры через стандартный ввод и стандартный вывод, чтобы программа могла знать, где и что искать.

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

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

Итак, отвечая на ваши вопросы:

В чем дело с /cgi -bin/*.cgi? Что с этим? Я не знаю, для чего этот каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения *.cgi.

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

Почему Perl всегда мешает. CGI и Perl (язык). Я также не знаю, что с этими двумя. Почти все время я слушаю эти два в комбинации «CGI и Perl». Эта книга — еще один отличный пример CGI-программирования с Perl. Почему бы не «Программирование CGI с помощью PHP/JSP/ASP». Я никогда не видел таких вещей.

Поскольку Perl является древним (более старым, чем PHP, JSP и ASP, которые все стали известны, когда CGI был уже старым, Perl существовал, когда CGI был новым) и стал довольно известным, будучи очень хорошим языком для обслуживания динамических веб-страниц через CGI, В настоящее время существуют другие альтернативы для запуска Perl на веб-сервере, главным образом mod_perl.

Программирование CGI на C меня очень смущает. в C?? Шутки в сторону?? Я не знаю, что сказать. Я просто смущен. «В C»? Это меняет все. Программа должна быть скомпилирована и выполнена.Это полностью меняет мой взгляд на веб-программирование.Когда я компилирую? Как программа запускается (потому что это будет машинный код, поэтому он должен выполняться как независимый процесс).Как он взаимодействует с веб-сервером? IPC? и взаимодействует со всеми серверами (в моем примере MATLAB и MySQL) с помощью программирования сокетов? Я потерялся!!

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

Говорят, что CGI устарел. Его больше не используют. Это так? Каково его последнее обновление?

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

A означает, что веб-сервер получает свои данные из программы (а не, например, файл).

Нет большой сделки. Это просто соглашение.

Я не знаю, для чего этот каталог cgi-bin на сервере. Я не знаю, почему у них есть расширения *.cgi.

Сервер должен знать, что делать с файлом (т.е. рассматривать его как программу для выполнения вместо того, чтобы просто обслуживать). Наличие расширения .html говорит ему использовать тип содержимого text/html. Имея расширение .cgi, он запускает его как программу.

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

Это не так. Perl был просто большим и популярным одновременно с CGI.

Я не использовал Perl CGI годами. Я долгое время использовал mod_perl и в настоящее время имею тенденцию к PSGI/Plack с FastCGI.

Эта книга — еще один отличный пример программирования CGI с Perl Почему бы не «Программирование CGI с помощью PHP/JSP/ASP».

CGI не очень эффективен. Лучшие методы для общения с программами из веб-серверов приходили примерно одновременно с PHP. JSP и ASP — это разные способы общения с программами.

Программирование CGI на C меня очень смущает. в C?? Серьезно??

Это язык программирования, почему бы и нет?

  • Введите код
  • Compile
  • URL доступа
  • Webserver запускает программу

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

Он не должен выполняться как независимый процесс (вы можете писать модули Apache в C), но вся концепция CGI заключается в том, что он запускает внешний процесс.

Как он взаимодействует с веб-сервером? IPC?

STDIN/STDOUT и переменные среды — как определено в спецификации CGI.

и взаимодействовать со всеми серверами (в моем примере MATLAB и MySQL), используя сокет программирование?

Использование любых методов, которые вам нравятся и которые поддерживаются.

Говорят, что CGI обесценивается. Его больше не используют. Это так?

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

Каково его последнее обновление?

CGI — это спецификация интерфейса между веб-сервером (HTTP-сервером) и исполняемой программой определенного типа, которая предназначена для обработки конкретного запроса.

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

Некоторое время CGI был проектом IETF в Интернете и, как таковой, имел срок годности. Он истек без обновления, поэтому не было стандарта CGI. Теперь это информационный RFC, но, как таковой, общепринятая практика и сама по себе не является стандартом. rfc3875.txt, rfc3875.html

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

Скомпилированные языки, такие как C, обычно использовались, как и языки сценариев, такие как perl, часто используя библиотеки, чтобы облегчить доступ к среде CGI.

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

По этой причине и для очень простого интерфейса к запросам и сеансам гораздо более популярны лучшие интегрированные среды между веб-серверами и приложениями. Среды, такие как современная реализация php с apache, намного лучше интегрируют целевой язык с веб-сервером и обеспечивают доступ к объектам запросов и сеансов, которые необходимы для эффективного обслуживания HTTP-запросов. Они предлагают гораздо более простой и богатый способ писать «программы» для обработки HTTP-запросов.

Будь вы написали CGI script, скорее зависит от интерпретации. Это, безусловно, работало над одним, но гораздо проще запускать php в качестве модуля, где интерфейс между script и сервером не является строго интерфейсом CGI.

7 Приложения CGI

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

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

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

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

Что кроется за аббревиатурой CGI?

CGI — это стандартный шлюзовой интерфейс (Common Gateway Interface) для запуска внешних программ под управлением сервера WWW. Соответственно, приложениями CGI называются программы, которые, пользуясь этим интерфейсом, получают через протокол HTTP информацию от удаленного пользователя, обрабатывают ее, и возвращают результат обработки обратно в виде ссылки на уже существующий документ HTML или другой объект (например, графическое изображение) или в виде документа HTML, созданного динамически.

Передача информации от удаленного пользователя приложению CGI обычно выполняется следующим образом.

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

Когда пользователь заполняет форму и нажимает указанную кнопку, данные передаются приложению CGI, путь к которому задается в заголовке формы. Это приложение получает через протокол HTTP данные из полей формы в виде пар значений “имя поля/значение”.

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

Все описанные процедуры мы рассмотрим в этой главе более подробно. Кроме того, мы приведем исходные тексты различных приложений CGI. Заметим, что возможны и другие сценарии работы с программами CGI.

Так как приложение CGI является ни чем иным, как программой, вы должны оттранслировать ее для той операционной системы, под управлением которой работает ваш сервер WWW. В некоторых случаях вы можете найти более удобным создавать программы CGI с использованием специально предназначенных для этого интерпретаторов, таких как Perl, или языка пакетных заданий. Например, вы можете создать программу CGI для сервера Microsoft Information Server как обычный пакетный файл *.bat. В нашей книге мы сконцентрируемся на использовании для создания программ CGI мобильного языка программирования C. Транслятор этого языка вы можете найти в любой операционной системе.

Создание форм

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

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

Описание формы

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

и с соответствующими параметрами.

Вот пример определения простейшей формы:

Здесь органы управления размещаются в таблице, состоящей из одного столбца и трех строк. В верхних двух строках мы разместили поля для ввода и редактирования текста, в последней строке — кнопку с названием Send. Внешний вид формы при ее просмотре в навигаторе показан на рис. 7.1.

Рис. 7.1. Простейшая форма для ввода двух текстовых строк

Перечислим допустимые параметры оператора

Форма выглядит так, как это показано на рис. 7.3.

Рис. 7.3. Форма для запуска программы CGI просмотра значений переменных среды

Обратите внимание, что после имени программы CGI через разделительный символ “?” указана строка параметров param1, которая может быть получена и проанализирована программой CGI.

Исходный текст программы CGI приведен в листинге 7.3.

Листинг 7.3. Файл chap7\viewenv\test.bat

В первой строке программа выводит в стандартный поток вывода STDOUT строку заголовка HTTP. Эта строка описывает тип передаваемых данных как text/plain, то есть обычный текст без оформления с использованием операторов HTML.

Вторая строка выводит в стандартный поток вывода пустую строку, которая отделяет заголовок HTTP от передаваемых данных.

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

И, наконец, в последней строке вызывается команда SET, которая выводит в поток STDOUT значения всех переменных среды, определенных в системе перед запуском программы.

Результат работы нашей программы CGI показан на рис. 7.4.

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

Ниже мы привели полный листинг, полученный при работе нашей программы CGI:

В этом листинге отображаются переменные среды, определенные специально для программы CGI сервером Microsoft Internet Information Server, а также переменные среды, стандартные для операционной системы Microsoft Windows NT.

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

Технология WWW допускает защиту страниц HTML, когда доступ к отдельным страницам предоставляется только для отдельных пользователей при предъявлении пароля. При этом используется так называемая система аутентификации, или проверки подлинности идентификатора пользователя.

Переменная среды AUTH_TYPE содержит тип идентификации, который применяется сервером. Например, для сервера WWW типа Microsoft Information Server при включении аутентификации в этой переменной будет храниться строка “NTLM”.

В этой переменной находится версия интерфейса CGI, с которой работает данный сервер. В нашем случае интерфейс имеет версию 1.1.

В этой переменной перечислены типы данных MIME, которые могут быть приняты навигатором от сервера WWW. Из приведенного выше листинга видно, что сервер Microsoft Internet Information Server может передать навигатору Microsoft Internet Explorer (который был использован для работы с программой CGI) графические изображения (image) в формате gif, jpeg, pjpeg, x-xbitmap. Подробно эти типы данных описаны в спецификации протокола MIME, рассмотрение которой выходит за рамки нашей книги.

В переменную HTTP_REFER записывается адрес URL документа HTML, который инициировал работу программы CGI. В нашем случае этот документ был записан на локальном диске компьютера в каталоге C:\!websrv\Sample\Chap7\viewenv.

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

Разрешение видеоадаптера, установленное в компьютере пользователя.

Допустимое количество цветов в системе пользователя.

Операционная система, под управлением которой работает навигатор.

Тип центрального процессора в компьютере удаленного пользователя.

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

Имя узла, на котором работает сервер WWW.

Метод кодирования, который может быть использован навигатором для формирования ответа серверу WWW.

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

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

Специальные команды серверу WWW.

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

Тип данных, присланных навигатором.

Путь к виртуальному каталогу, в котором находится программа CGI.

Как правило, при настройке сервера WWW администратор выделяет один или несколько каталогов для хранения расширений сервера в виде программ CGI или ISAPI. Для файлов, записанных в такие каталоги, устанавливается доступ на запуск.

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

Физический путь к программе CGI.

Строка параметров, указанная в форме после адреса URL программы CGI после разделительного символа “?”.

Адрес IP узла, на котором работает навигатор удаленного пользователя.

Доменное имя узла, на котором работает навигатор удаленного пользователя. Если эта информация недоступна (например, для узла не определен доменный адрес), вместо доменного имени указывается адрес IP, как в переменной REMOTE_ADDR.

Имя пользователя, которое используется навигатором для аутентификации. Используется только в том случае, если сервер WWW способен работать с аутентификацией и программа CGI отмечена как защищенная.

Метод доступа, который используется для передачи данных от навигатора серверу WWW. В своих примерах мы используем методы доступа GET и POST, хотя протокол HTTP допускает применение и других методов доступа, например, PUT и HEAD.

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

Доменное имя сервера WWW или адрес IP сервера WWW, если доменное имя недоступно или не определено.

Имя и версия протокола, который применяется для выполнения запроса к программе CGI.

Номер порта, на котором навигатор посылает запросы серверу WWW.

Название и версия программного обеспечения сервера WWW. Версия следует после названия и отделяется от последнего символом “/”.

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

Примеры программ CGI

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

Программа CGIHELLO

Программа CGIHELLO представляет собой простейшую программу CGI, которая запускается при помощи кнопки в форме, возвращая навигатору документ HTML, созданный динамически.

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

В этом документе определена форма, содержащая единственную кнопку, созданную оператором и имеющую тип SUBMIT.

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