Руководство по написанию CGI-скриптов на Perl и REXX

Original:http://www.slac.stanford.edu/slac/www/resource/how-to-use/cgi-rexx/

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

Есть несколько простых программных библиотек для облегчения написания CGI-скриптов. CGI-lib.rxx является REXX библиотеку функций (доступно на SLAC с помощью REXX
ЗВОНИТЕ PUTENV "REXXPATH = / АФН / SLAC / WWW / SLAC / WWW / инструмент / CGI-Rexx"
заявления для включения в библиотеку во время выполнения) и CGI-lib.pl такая же библиотеки в Perl написаны Стив Бреннер (есть исполняемый копию этого libary в SLAC в / АФН / SLAC / г / WWW / CGI-Библиотека / CGI-lib.pl). NCSA имеет очень полезный набор подпрограмм Perl CGI обработчик, которые доступны через анонимный FTP.Another набор Perl CGI Server Side сценарии написаны Бриджит Еллинек доступно в соответствии с GNU Public License. Существует также исходный код для www.stanford.edu скриптов и программ. Существует также индекс Perl WWW программы собраны Худ Граф. Наконец см. Центр Веб-разработки.

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

Прежде чем приступить к написанию сценария, вы также можете проверить некоторые черновые заметки на SLAC веб-утилиты, предоставляемые CGI скриптов.

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

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

Начало ввода в сценария
Вход может быть направлен в сценарий по-разному в зависимости от Равномерное клиента ресурса (URL) или язык разметки гипертекста (HTML) Форма:

    QUERY_STRING переменной среды

    QUERY_STRING определяется как все, что следует в первую очередь? в URL, используемый для доступа к шлюзу. Эта информация может быть добавлен документ ISINDEX HTML или HTML формы (с GET действия). Это также может быть вручную встроенные в HTML гипертекстовые ссылки, или якорь, который ссылается на ваш шлюз. Эта строка, как правило, информация запроса, например, , что пользователь хочет, чтобы найти в базе данных, или, возможно, закодированные результаты ваших форму обратной связи. Он может быть доступен в REXX, используя String = GETENV ('QUERY_STRING')
    или в Perl с помощью строки $ = $ ENV ('QUERY_STRING');

    Эта строка кодируется в стандартный формат URL который меняет пространств +, и кодирование специальных символов с кодировкой% шестнадцатеричном хх. Вам нужно будет расшифровать его, чтобы использовать его. Вы можете ознакомиться с CGI-lib.rxx REXX ПОРЯДОК DeWeb или Perl фрагмент кода дает примеры того, как для декодирования специальных символов.

    Если ваш сервер не является расшифровка результатов формы, вы получите строку запроса расшифровал для вас на командной строке. Это означает, что строка запроса будут доступны в REXX с помощью команды PARSE ARG, или в Perl $ ARGV [п] массива.

    Например, если у вас есть URL http://www.slac.stanford.edu/cgi-bin/foo?hello+world и вы используете команду REXX PARSE ARG arg1 arg2 то Arg1 будет содержать "привет" и будет содержать Arg2 "Мир" (то есть знак + заменяется на пробел).
    В Perl $ ARGV [1] содержит "привет" и $ ARGV [2] содержит "мир". Если вы решите использовать командную строку для доступа на входе, что вам нужно сделать менее обработку данных перед ее использованием.

    PATH_INFO переменной среды

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

    CGI обеспечивает дополнительную информацию для встраивания в URL для шлюза, который может быть использован для передачи дополнительной контексте конкретной информации в сценарии. Эта информация, как правило, доступны в качестве "дополнительной" информации после того, как путь к шлюзу в URL. Эта информация не кодируется сервер в любом случае. Он может быть доступен в REXX, используя String = GETENV ('PATH_INFO'), или с помощью Perl строка $ = $ ENV ('PATH_INFO');

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

    <A HREF="http://www/cgi-bin/foo/language=english"> Foo </ A>

    Когда сервер выполняет Фу, он даст мне PATH_INFO из / Язык = английский, а моя программа может декодировать это и действовать соответственно.

    PATH_INFO и QUERY_STRING могут быть объединены. Например, URL:
    http://www/cgi-bin/htimage/usr/www/img/map?404, 451
    заставит сервер, чтобы запустить скрипт htimage. Она будет проходить оставшуюся информацию путь "/ USR / WWW / IMG / карта" htimage в PATH_INFO переменная окружения, и передать "405451" в переменной окружения QUERY_STRING. В этом случае htimage это скрипт для реализации активной карты поставляются с HTTPD ЦЕРН.

    Стандартный входной

    Если ваша форма имеет METHOD = "POST" в виде тега, ваша программа CGI получит закодированной формы ввода на стандартный ввод (STDIN в Unix). Сервер не будет посылать вам EOF по концу данных, вместо этого вы должны использовать CONTENT_LENGTH переменной окружения, чтобы определить, какой объем данных вы должны прочитать со стандартного ввода. Вы можете сделать это в REXX, используя In = Чарин (1, GETENV ('CONTENT_LENGTH')), или в Perl с помощью read (STDIN, $ в $ ENV {'CONTENT_LENGTH'});

    Если вы хотите пройти стандартный ввод на другой сценарий, который вы будете называть позже, то вы, возможно, пожелают рассмотреть CGI-lib.rxx REXX ПОРЯДОК ReadPost.

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

REXX ПРОЦЕДУРЫ ReadForm вместе с MethGet и MethPost, все имеющиеся в CGI-lib.rxx, могут быть использованы для упрощения задачи чтение входных данных из формы.

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

Форма данных представляет собой поток имя = значение пар, разделенных амперсанда (&) характер. Каждое имя = значение пары URL закодирован, то есть пространства превращаются в знаки плюс и некоторые символы кодируются в шестнадцатеричные. Чтобы расшифровать данные формы необходимо сначала разобрать блок данных в форме отдельных пар имя = значение выбросить амперсанда. Затем вы должны анализировать каждую пары имя = значение в отдельное название и значение. Используйте первый знак равенства вы столкнулись разделить данные. Если есть больше чем один, то что-то не так с данными. Опять же выбрасывать знак равенства. Наконец отменить URL кодирования каждого имени и значения.

Вы можете ознакомиться с REXX или Perl фрагмент кода, приводя примеры из расшифровки формы ввода.

При использовании имени и значения информации в сценарии, вы должны знать, что:

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

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

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

Некоторые общие MIME типы, имеющие отношение к WWW являются:

    "Текст" Content-Type, который используется для представления текстовой информации в ряде наборов символов и языков описания отформатированный текст в стандартной форме. Два наиболее вероятных подтипов:
        текст / равнина текст без специальных требований форматирования.
        текст / HTML: текст со встроенными командами HTML
    "Приложение" Content-Type, который используется для передачи данных приложений или двоичных данных. Два часто используемых подтипов:
        применение / приписка: данные в формате PostScript, и должны быть поданы PostScript interptreter.
        применение / двоичном виде: данные в неизвестном формате двоичного, таких как результаты передачи файлов.
    "Образ" Content-Type для передачи неподвижных изображений (фото) данных. Есть много возможных подтипов, но те, наиболее часто используемые на WWW являются:
        Изображение / рисунок: изображение в формате GIF.
        Изображение / XBM: изображение в формате Bitmap X.
        Изображение / JPEG: изображение в формате JPEG.

Для того, чтобы сообщить серверу тип содержимого вашего выхода, в первой строке выходного следует читать:
Content-Type: тип / подтип
где тип / подтип MIME типа и подтипа для печати.

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

Вы можете просмотреть REXX фрагмент кода дает пример обработки Content-тип информации.

После этих двух линий были выводиться, любой выход на стандартный вывод (например, команда REXX SAY) будут включены в документ отправляется клиенту. Этот вывод должен быть в соответствии с Content-Type заголовка. Например, если указанный заголовок Content-Type текст / HTML, то следующий вывод должен содержать HTML-форматирования, такие как использование <BR> или <P> для запуска новых линий или <PRE> удалить автоматическое форматирование HTML.

Диагностика и сообщения об ошибках
Поскольку стандартный вывод содержится в документе, направленном, диагностика диагностика выводится с ГОВОРЯТ команда появится в документе. Вы можете просмотреть REXX фрагмент кода дает пример диагностических отчетов.

Если возникают ошибки (например, нет данных, полученных, недопустимые символы найдены, слишком много аргументов указано, просил недействительной команду, которая будет выполнена, ошибка в параметрах или неопределенная переменная встречается в сценарии REXX) ​​скрипт должен представить подробную информацию о том, что это неправильно и т.д. Это может быть очень полезно предоставить информацию о настройках различных WWW переменные среды, которые установлены.

CGIerror, CGIdie и MyURL REXX процедур в CGI-lib.rxx оказать некоторую помощь для сообщений об ошибках. Кроме того, обзор фрагментов кода с помощью REXX CGIerror и использования CGIdie, а также типичный выход CGIerror и CGIdie выход.


Два простых REXX WWW CGI скриптов
Чтобы получить на веб-сервер для выполнения CGI-сценарии, вы должны:

    Напишите сценарий. Для упрощения этого, вы можете воспользоваться CGI-lib.rxx библиотека функций, в том числе введены ранее на этой странице. Несколько простых, но полные примеры могут помочь:
        источник сценарий для включения UNIX функция пальца.
        Источник минимальной форме HTTP и сценариев.
    Сделайте скрипт исполняемым на веб-сервере. В SLAC на Unix это делается с помощью команды CHMOD, например,
        CHMOD о + х / u/sf/cottrell/bin/cgi1.rxx
        CHMOD и + х / u/sf/cottrell/bin/cgi1.rxx
    Получить веб-мастера, чтобы добавить правило к правилам веб-сервера файл, чтобы веб-сервер для выполнения вашего скрипта. Более подробную информацию о правилах файл на сервере W3C, можно найти, посмотрев на конфигурационный файл W3C HTTPD, а также на простом примере некоторых отображение заявления использовать в файле правил.

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

Другие источники интересов

    Печатная:
        Книга HTML и CGI развязали есть много полезной информации о написании CGI-скриптов в C, Perl и REXX.
        Книга Введение в CGI / Perl Стив Бреннер и Эдвин Аоки является полезным введение в написание CGI-скриптов на Perl.
    Написание World-Wide Web CGI скриптов в REXX, представленные на Весной 1996 SHARE техническая конференция, 7 марта 1996 года, Анахайм штат Калифорния.
    Страница NetRexx языка содержит информацию об экспериментальном проекте Майка Cowlishaw (авторе из REXX), чтобы создать Rexx интерфейсом для Java.
    Кроме того, настроиться на телеконференции comp.infosystems.www.authoring.cgi которая охватывает обсуждение развития Common Gateway Interface (CGI) сценарии, поскольку они касаются веб-разработки страницы. Возможные темы включают обсуждения, как справиться с результатами форм, как для создания изображения на лету, и как собрать другие интерактивные веб-предложений.
    World Wide Web (часто задаваемые вопросы, с ответами) отвечает на многие, многие вопросы о World Wide Web в целом.
    Если вы используете Perl и у вас есть общие Perl вопрос, который на самом деле не CGI-конкретный вопрос, ознакомьтесь с Perl FAQ.
    Если вы будете писать скрипты для Windows NT, то увидеть Somarsoft - Windows NT вопросам безопасности

Благодарности
Большая часть текста Общий интерфейс шлюза и форм документов происходит из NCSA. Полезная информация и текст был получен также от World-Wide Web: Как серверы Работа, Марк Хэндли и Джон Crowcroft, опубликованной в связях, февраль 1995 года.

Информация о тарифах и ценах на рекламные услуги, продвижение и раскрутку, создание сайтов, представленная на сайте носит справочно-информационный характер и не является публичной офертой. Сайт web-meister.ru работает в информационно-справочном режиме, оказание и заказ услуг создания сайтов и поисковой оптимизации возможны только после заключения договора с ООО"Путевкин". Информационно-справочные сведения, включая цены и любую другую информацию на сайте, не являются ни рекламой, ни офертой. Для получения полной информации по стоимости рекламных услуг, и для заключения договора на оказание информационно-рекламных услуг по созданию и раскрутке сайтов, пожалуйста, обращайтесь в наши офисы продаж. По всем вопросам работы сайта обращаться по email: info@web-meister.ru