Що таке common gateway interface. Введення від браузера. Конфігурація сервера для CGI

Common Gateway Interface (CGI, рус. Загальний шлюзовий інтерфейс) - це стандартний метод динамічного управліннявмістом веб-сторінок за допомогою спеціальних програм, що виконуються на стороні веб-сервера. Ці програми називаються CGI-обробники або шлюзи, але частіше – CGI-скрипти, т.к. зазвичай вони пишуться скриптовими мовами, в основному на Perl.

Оскільки гіпертекст статичний за своєю природою, веб-сторінка не може безпосередньо взаємодіяти з користувачем. До появи JavaScript , не було іншої можливості відреагувати на дії користувача, крім передати введені ним дані на веб-сервер для подальшої обробки. У разі CGI ця обробка здійснюється за допомогою зовнішніх програмі скриптів, звернення яких виконується через стандартизований (див. RFC 3875: CGI Version 1.1) інтерфейс - загальний шлюз. Спрощена модель, що ілюструє роботу CGI, наведена на рис. 1.

Як працює CGI?

Узагальнений алгоритм роботи через CGI можна подати у такому вигляді:

  1. Клієнт запитує CGI-додаток з його URI.
  2. Веб-сервер приймає запит та встановлює змінні оточення , через них додатку передаються дані та службова інформація.
  3. Веб-сервер перенаправляє запити через стандартний потіквведення (stdin) на вхід програми, що викликається.
  4. CGI-додаток виконує всі необхідні операції та формує результати у вигляді HTML.
  5. Сформований гіпертекст повертається веб-сервер через стандартний потік виведення (stdout). Повідомлення про помилки надсилаються через stderr.
  6. Веб-сервер передає результати запиту клієнта.

Області застосування CGI

Найчастіше завдання, на вирішення якої застосовується CGI - створення інтерактивних сторінок, зміст яких залежить від дій користувача. Типовими прикладамитаких веб-сторінок є форма реєстрації на сайті або форма для надсилання коментарів. Інша сфера застосування CGI, що залишається за лаштунками взаємодії з користувачем, пов'язана зі збором та обробкою інформації про клієнта: встановлення та читання «печенюшок»-cookies; отримання даних про браузер та операційну систему; підрахунок кількості відвідувань веб-сторінки; моніторинг веб-трафіку тощо.

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

ЗВЕРНІТЬ УВАГУ: CGI - це не мова програмування! Це простий протокол, що дозволяє веб-серверу передавати дані через stdin та читати їх із stdout. Тому, як CGI-обробник може скористатися будь-яка серверна програма, здатна працювати зі стандартними потоками введення-виведення.

Hello, world!

Приклад простого CGI-скрипту на мові Perl наведено в лістингу 1. Якщо цей код зберегти у файлі з ім'ям hello (ім'я може бути будь-яким, розширення - теж), помістити файл у серверний каталог cgi-bin (точніше, у той каталог веб-сервера , який призначений для CGI-програм і вказаний в налаштуваннях веб-сервера) і встановити для цього файлу права на виконання (chmod uo+x hello), то він буде доступний за адресою виду http://servername/cgi-bin/hello.

Лістинг 1. Приклад CGI-скрипту (Perl)

#!/usr/bin/perl print "Content-type: text/html\n\n"; print< CGI say Hello

Hello, world!



HTML exit;

У цьому коді рядок #!/usr/bin/perl вказує повний шлях до інтерпретатора Perl. Рядок Content-type: text/html\n\n - http-заголовок, що задає тип вмісту (mime-type). Подвоєний символ розриву рядка (\n\n) - обов'язковий, він відокремлює заголовки від тіла повідомлення.

Змінні оточення

Всі CGI-програми мають доступ до змінних оточення, які встановлюються веб-сервером. Ці змінні відіграють важливу роль під час написання CGI-програм. У таблиці перелічені деякі із змінних, доступних CGI.

Змінне оточенняОпис
CONTENT_TYPE Тип даних, які передаються на сервер. Використовується, коли клієнт надсилає дані, наприклад, завантажує файл.
CONTENT_LENGTHРозмір вмісту запиту. Ця змінна визначена для запитів POST.
HTTP_COOKIEПовертає набір «куків» як пар «ключ значення».
HTTP_USER_AGENTІнформація про агента користувача (браузер)
PATH_INFOШлях до каталогу CGI
QUERY_STRINGРядок запиту (URL-encoded), що передається методом GET.
REMOTE_ADDRIP-адреса клієнта, який виконує запит.
REMOTE_HOSTПовне ім'я клієнта (FQDN). (Якщо є)
REQUEST_METHODМетод, яким виконується запит. Найчастіше GET чи POST.
SCRIPT_FILENAMEПовний шлях до скрипта, що запитується (у файловій системі сервера).
SCRIPT_NAMEІм'я скрипту
SERVER_NAMEІм'я сервера
SERVER_ADDRIP-адреса сервера
SERVER_SOFTWAREІнформація про серверне ПЗ

У лістингу 2 наведено код невеликої програми Perl, що виводить список змінних оточення. Результат її роботи наведено на рис. 2.

Лістинг 2. Змінні оточення

#!/usr/bin/perl print "Content-type: text/html\n\n"; print " \n \n

Environment

\n"; foreach (sort keys %ENV) ( print " $_: $ENV($_)
\n"; ) print "

\n"; exit;

Передача даних: метод GET

Метод GET використовується для передачі urlencoded -даних через рядок запиту. Адреса запитуваного ресурсу (CGI-скрипта) і дані, що передаються йому, відокремлюються знаком «?». Приклад такої адреси:

http://example.com/cgi-bin/script.cgi?key1=value1&key2=value2

GET використовується за замовчуванням для даних, введених в адресний рядок браузера. Такий самий рядок може бути сформований при надсиланні даних із веб-форми (тег

), якщо метод передачі форми не указан. Вся інформація, що надсилається методом GET, передається у відкритому вигляді, тому ніколи не слід використовувати його для відправки на сервер паролів або іншої інформації. Метод GET має обмеження за розміром: рядок запиту має бути не довшим за 1024 символи.

Інформація, що надсилається методом GET, передається в заголовку QUERY_STRING у вигляді рядка, що складається з пар виду ключ = значення, CGI-скрипт може отримати її через однойменну змінну оточення.

Лістинг 3. Надсилання даних із веб-форми методом GET

A simple CGI scripting: Sending data using GET-method You name: name="user">
Where are you from?: name="from">



Після введення даних у форму з лістингу 3 та натискання кнопки "Submit" буде сформовано рядок запиту виду:

http://example.com/cgi-bin/ sayhello?user=sometext&from=anothertext

де: sayhello – ім'я CGI-скрипту; user та from - імена параметрів; деякітекст і іншийтекст - введені користувачем значення відповідних параметрів.

У лістингу 4 наведено приклад скрипту, який може обробити дані форми листингу 3.

Лістинг 4. Надсилання даних з веб-форми методом GET

#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # Аналізуємо оточення $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; if ($ENV(" REQUEST_METHOD") eq " GET") ($buffer = $ENV(" QUERY_STRING"); ) # Розділяємо рядок запиту на пари виду ключ/значення @pairs = split(/&/, $buffer); foreach $pair (@pairs) ( ($name, $value) = split(/=/, $ pair), $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM($name) = $value; Зберігаємо дані в масив) # Відправляємо заголовок print "Content-type: text/html\n\n"; # Відправляємо гіпертекст print< CGI say Hello

Hello, $FORM(user) from $FORM(from)!



HTML exit;

Передача даних: метод POST

У загальному випадку найбільш підходящим для передачі CGI-скрипту є метод POST. Блок даних формується так само, як і для методу GET, але безпосередньо передача здійснюється в тілі запиту. Дані надходять на вхід CGI-програми через стандартне введення(STDIN).

Для надсилання даних цим методом він повинен бути явно заданий в описі форми (action="POST").

Для обробки вхідних даних CGI-скрипт повинен прочитати stdin, а щоб це правильно зробити, йому потрібно дізнатися розмір повідомлення зі змінної CONTENT_LENGTH. Для ілюстрації цього модифікуємо блок аналізу оточення в лістингу 4 замінивши його наступним кодом:

... # Аналізуємо оточення $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; if ($ENV(" REQUEST_METHOD") eq " POST")(read( STDIN, $buffer, $ENV(" CONTENT_LENGTH"}); } ...

Подальша обробка збережених у змінній $buffer параметрів та їх значень виконується так само, як і при використанні методу GET.

Переваги CGI

Багато можливостей CGI зараз дублюються такими технологіями, як DHTML , ActiveX або Java-аплетами. Основними перевагами використання серверних скриптів є те, що ви можете бути впевнені, що всі клієнти (за рідкісним винятком, зазвичай пов'язаним з блокуванням доступу до певних ресурсів на рівні файрвола) зможуть працювати з серверним додатком. Клієнтські програми можуть бути просто відключені в браузері, або зовсім не підтримуватися.

Недоліки CGI

Найбільшим недоліком цієї технології є підвищені вимоги до продуктивності веб-сервера. Справа в тому, що кожне звернення до CGI-додатку викликає породження нового процесу, з усіма накладними витратами, що звідси випливають. Якщо ж додаток написано з помилками, то можлива ситуація, коли він, наприклад, зациклиться. Браузер перерве з'єднання після закінчення тайм-ауту, але на серверній стороні процес триватиме доти, доки адміністратор не зніме його примусово. У цьому плані клієнтські скрипти мають істотну перевагу, т.к. вони виконуються локально.

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

Постійна адреса цієї сторінки:

Andover, Massachusetts, November 19, 2003

The Commerce Group, Inc. (NYSE: CGI), величезний підписувач приватного туристичного автомобіля в Massachusetts and CGI Group Inc. (CGI) (TSX: GIB.A; NYSE: GIB;), керуючий інформаційною технологією та бізнес-процесуваннями послуг, розглянутий протягом шість-років бізнес-процесів відсурінгу (BPO) договір оновлений в США $35 мільйон. CGI буде здійснювати повну політику процесуальних послуг для Masassachusetts private passenger and commercial automobile lines as well as providing CGI's CollaborativeEdge agency interface tool, application support and maintenance, regulatory support, systems consulting, and document management services.

Gerald Fels, Commerce Group's executive vice-president and CFO, зазначений: "Як керуючим власником приватного транспортного засобу в Massachusetts, наш лад є реалізовувати наших agents і робітників з послугами, які допомагають їм виконувати їх високий рівень. Понад роки ми були ускладнені сильними відносинами з CGI. Їхня система є міцною і прискореною і їхньою групою є дуже знайомим з нашими міжнародними процесами. Це важливо для нас."

Serge LaPalme, president, insurance business services for CGI added: "Ви є дуже pleased для того, щоб продовжувати наші відносини з Commerce Group, один, що продовжує протягом 30 років. У нашому успіху наші клієнти мають більший фокус на їхньому керованому бізнесі, ми бачимо безліч технологій, які існують, коли вони несуть. adapt existing solutions to this constantly evolving sector."

About The Commerce Group, Inc.

The Commerce Group, Inc., як іспанська holding company, є headquartered в Webster, Massachusetts. Commerce Group"з власності і часткове відшкодування підприємств, включаючи Commerce Insurance Company і Citation Insurance Company в Massachusetts, Commerce West Insurance Company в Каліфорнії та американській Commerce Insurance Company в Ohio. Великий персональний автомобільний страхування групи в country by A.M. Best, заснований на 2002 direct written premium information.

About CGI
Заснований в 1976 році, CGI є 50 великих незалежних інформаційних технологій послуг фірми в Північній Америці, заснованої на її headcount. CGI and its affiliated companies employ 20,000 profesionales. CGI's annualised revenue run-rate is currently CDN$2.8 billion (US$1.9 billion) and at September 30, 2003, CGI's order backlog був CDN$12.3 billion (US$9.1 billion). CGI забезпечує кінець-кінцем IT і бізнес-процеси обслуговування клієнтів світового світу з офісів в Канаді, США і Європі. CGI's shares будуть розміщені на TSX (GIB.A) і NYSE (GIB) і включаються в TSX 100 Складний Index, як добре, як S&P/TSX Canadian Information Technology and Canadian MidCap Indices. Website: .

Інтерактивний інтерфейс користувача являє собою систему, що забезпечує взаємодію користувача та програми. Для WWW інтерактивний інтерфейс можна визначити як послідовність HTML-документів, що реалізують інтерфейс користувача. Можна також умовно класифікувати принципи побудови інтерфейсу на кшталт формування HTML-документа:

    статичний;

    динамічний.

У першому випадку джерелом інтерфейсу є HTML-документ, створений у текстовому або HTML-орієнтованому редакторі. Отже, цей документ залишається незмінним протягом використання. У другий випадок джерелом інтерфейсу є HTML-документ, згенерований cgi-модулем. Отже, з'являється деяка гнучкість у зміні інтерфейсу під час використання .

Таким чином можна ввести поняття інтерактивного інтерфейсу для WWW. Інтерактивний інтерфейс для WWW є послідовністю статичних або динамічно формованих HTML-документів, що реалізують інтерфейс користувача.

Практично будь-яка задача, яка вирішує проблему отримання даних від клієнта, пов'язана з побудовою інтерфейсу. Найбільш цікавою є побудова інтерфейсів до різних баз даних, доступ до SQL-сервера, отримання інформації від периферійних пристроїв, створення клієнтських робочих місць. Все це можливо за допомогою CGI (Common Gateway Interface). Common Gateway Interface (CGI) є стандартом інтерфейсу зовнішньої прикладної програми з WWW сервером.

Завдання побудови вищезгаданих інтерфейсів ділиться на дві частини (додаток 2):

    Клієнтська частина. Для створення клієнтської частини необхідно створити HTML-документ, в якому реалізовано інтерфейс користувача. У мові HTML це можливо у вигляді форм.

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

Специфікація cgi

CGI визначає 4 інформаційні потоки (додаток 3):

1) Змінні оточення умовно поділяються на два типи:

а) загальні всім типів запитів (встановлюються всім типів);

б) залежні від способу запиту.

2) Стандартний вихідний потік

СGI- модуль виводить інформацію у стандартний вихідний потік. Цей висновок може бути або документ, згенерований cgi-модулем, або інструкцію серверу, де отримати необхідний документ. Зазвичай cgi-Модуль робить свій висновок. Перевага такого підходу в тому, що cgi-модуль не повинен формувати повний заголовок HTTP на кожен запит.

3) Стандартний вхідний потік

У разі методу запиту POSTдані передаються як вміст запиту HTTP. І будуть надіслані до стандартного вхідного потоку. Дані передаються cgi-модулю у такій формі: name= value& name1= value1&...& nameN= valueN,

де name- Ім'я змінної, value- значення змінної, N- Кількість змінних.

На файловий дескриптор стандартного потоку введення надсилається CONTENT_LENGTH байт. Також сервер передає cgi-модулю CONTENT_TYPE (тип даних). Сервер не надсилає символ кінця файлу після передачі CONTENT_LENGTH байт даних або після того, як cgi-модуль їх прочитає. Змінні оточення CONTENT_LENGTH та CONTENT_TYPE встановлюються в той момент, коли сервер виконує модуль cgi. Таким чином, якщо в результаті виконання форми з аргументом тега FORM - METHOD="POST" сформовано рядок даних firm=МММ&price=100023, то сервер встановить значення CONTENT_LENGTH рівним 21 і CONTENT_TYPE в application/x-www-form-urlencoded, а в стандартний потік введення надсилається блок даних.

У разі методу GET, рядок даних передається як частина URL. Тобто. наприклад, http://host/cgi-bin/script?name1=value1&name2=value2

У цьому випадку змінна оточення QUERY_STRING набуває значення name1=value1&name2=value2

4) Аргументи командного рядка

СGI- модуль у командному рядку від сервера отримує: залишок URL після імені cgi-модуля як перший параметр (перший параметр буде порожній, якщо було тільки ім'я cgi-модуля), і список ключових слів як залишок командного рядка для скрипту пошуку, або чергуються імена полів форми з доданим знаком рівності та відповідних значень змінних. Ключові слова, імена та значення полів форми передаються декодованими (з HTTP URL формату кодування) та перекодованими відповідно до правил кодування Bourne shell так, що cgi-модуль у командному рядку отримає інформацію без необхідності здійснювати додаткові перетворення.

Після формування структури "ім'я-значення" можна розпочати вирішення завдань, заради яких, власне, створювався cgi-модуль. p align="justify"> Наступним важливим моментом є динамічне формування cgi-модулем HTML-документа (оформлення результату роботи модуля). Наприклад, таблиці вибірки із бази даних. Для цього cgi-модуль повинен видати стандартний вихідний потік заголовок що складається з рядка: Content-type: text/htmlта порожнього рядка (двох символів CR). Після цього заголовка можна давати будь-який текст у форматі HTML.

Власникам інтернет-магазинів не з чуток знайоме поняття «електронна комерція», вони вже точно знають відповідь на питання «e-commerce - що це таке». Але якщо розібратися в суті, то спливає багато нюансів і цей термін набуває більш широкого значення.

E-commerce: що таке?

Загальне поняття звучить так: під електронною комерцією розуміється певний підхід до ведення бізнесу, що передбачає включення у собі низки операцій, використовують цифрову передачу даних під час надання товарів чи наданні послуг/робіт, зокрема з допомогою інтернету.

Таким чином, це будь-яка комерційна угода, яка відбувається за допомогою електронного засобу зв'язку.

Схема роботи влаштована так:

  • будь-який може бути блогер або будь-який інший власник власної інтернет-сторінки) реєструється в даній системі;
  • отримує власне посилання;
  • розміщує спеціальний код на своїй веб-сторінці – з'являється реклама обраного офіційного партнера e-Commerce Partners Network;
  • стежить за конверсією сайту;
  • заробляє певний відсоток за кожну покупку відвідувача свого сайту, який перейшов за партнерським посиланням.

WP e-Commerce

Багато людей зараз захоплені електронною комерцією, в першу чергу через бажання створити власний веб-сайт, унікальний інтернет-магазин для продажу власної продукції. Для задоволення цього попиту розробники сконцентрувалися на створенні e-commerce template (шаблонів електронної комерції). Що таке розглянемо далі.

Одним із таких прикладів шаблонів є WordPress e-commerce. Це плагін кошика покупок для WordPress (одна з найвідоміших систем управління веб-ресурсом), призначається в першу чергу для створення та організації блогів). Надається абсолютно безкоштовно та дає можливість відвідувачам сайту здійснювати покупки на інтернет-сторінці.

Іншими словами, цей плагін дозволяє створити інтернет-магазин (на базі WordPress). Плагін цієї електронної комерції має всі необхідні інструменти, налаштування та опції, що відповідають сучасним потребам.

Завдяки Всесвітньому павутинню, майже будь-хто може дати інформацію в Інтернеті в приємному для очей і придатному для широкого поширення вигляді. Ви безперечно подорожували Інтернетом і бачили інші сайти, і тепер ймовірно знаєте, що лякаючі скорочення типу "HTTP" і "HTML" - просто своєрідні скорочення для "Веб" і "спосіб вираження інформацій в Інтернеті". Можливо, у Вас вже є деякий досвід подання інформації в Інтернеті.

Інтернет довів, що є ідеальним середовищем для розподілу інформації, як видно з його величезної популярності та масштабного розвитку. Хоча дехто ставить під сумнів корисність Інтернету і приписують її широкий розвиток і популярність головним чином нав'язливій рекламі, Інтернет безперечно є важливим засобом подання різноманітних видів інформації. Мало того, що існує безліч послуг з надання найсвіжішої інформації (новини, погода, спортивні події в реальному часі) та матеріалів довідкового характеру в електронному вигляді, також пропонуються значні обсяги даних іншого роду. Податкове управління США, яке розповсюдило всі свої бланки податкових декларацій у 1995 році та іншу інформацію через Всесвітнє павутиння, нещодавно зізналося про отримання листів від шанувальників свого Веб-сайту. Хто б міг подумати, що Податкове управління колись отримуватиме листи від шанувальників? Це сталося не тому, що його сайт був добре оформлений, а тому що він виявився по-справжньому корисним інструментом для тисяч, а можливо, і мільйонів людей.

Що робить Інтернет унікальним і таким привабливим інформаційним сервісом? Насамперед тим, що він надає інтерфейс гіперсередовища для даних. Згадайте дисковод жорсткого диска комп'ютера. Як правило, дані виражаються в лінійному вигляді, аналогічно файловій системі. Наприклад, Ви маєте ряд папок, а всередині кожної папки є документи або інші папки. Веб використовує різну парадигму для вираження інформації званої гіперсередовищем. Гіпертекстовий інтерфейс складається з документа та зв'язків. Зв'язки - це слова, куди кликають, щоб побачити інші документи чи знайти інші види інформації. Веб розширює концепцію гіпертексту, включивши інші типи носіїв, наприклад, графіку, звуки, відео (звідси ім'я "гіперсередовище"). Виділення тексту або графіки на документі дозволяє побачити пов'язану інформацію про виділений елемент у будь-якій кількості форм.

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

Хоча Інтернет надає для інформації унікальний інтерфейс гіперсередовища, є багато інших ефективних способів розподілу даних. Наприклад, мережеві послуги типу Протоколу передачі файлів (FTP) та група новин "Gopher" існували набагато раніше появи Всесвітньої павутини. Електронна пошта була первинним середовищем для зв'язку та обміну інформацією через Інтернет та більшістю інших мереж майже з самого початку функціонування цих мереж. Чому Інтернет став таким популярним способом розподілу інформації? Мультимедійний аспект Інтернету зробив відчутний внесок у його небувалий успіх, але для того, щоб Інтернет став найбільш ефективним, він має бути інтерактивним.

Без можливості отримувати введення від користувачів і давати інформацію, Інтернет був би повністю статичним середовищем. Інформація була б доступна лише у форматі, визначеному автором. Це б підірвало одну з обчислювальних можливостей взагалі: інтерактивну інформацію. Наприклад, замість того, щоб примушувати користувача до перегляду кількох документів, як якщо б він або вона переглядали книгу або словник, буде краще дозволити користувачеві визначити ключові слова за їхньою тематикою. Користувачі можуть налаштовувати дані, а не покладатися на жорстку структуру, визначену постачальником вмісту.

Термін "сервер Веб" може ввести в оману, тому що він може ставитися і до фізичної машини та програмного забезпечення, яке використовується в ній для взаємодії з Інтернет-браузерами. Коли браузер запитує вказану адресу Веб, він спочатку підключається до машини через Інтернет, надсилаючи програмному забезпеченню Веб-сервера запит про документ. Це програмне забезпечення працює безперервно, очікуючи надходження таких запитів та відповідаючи відповідним чином.

Хоча сервери можуть надсилати та отримувати дані, у самого сервера функціональні можливості обмежені. Наприклад, найбільш примітивний сервер може лише надіслати потрібний файл на браузер. Сервер зазвичай не знає, що робити з тим чи іншим додатковим введенням. Якщо Інтернет-провайдер не повідомляє серверу, як обробити таку додаткову інформацію, найімовірніше сервер проігнорує введення.

Щоб сервер зміг виконувати й інші операції, крім пошуку та пересилання файлів на Інтернет-браузер, потрібно знати, як розширити функціональні можливості сервера. Наприклад, сервер Веб не може здійснювати пошук у базі даних, на основі ключового слова, введеного користувачем, та повертати кілька документів відповідності, якщо така здатність не була якимось чином запрограмована для сервера.

Що таке CGI?

Загальношлюзовий інтерфейс (CGI) є інтерфейсом до сервера, який дозволяє розширити функціональні можливості сервера. За допомогою CGI можна працювати в діалоговому режимі з користувачами, які звертаються до вашого сайту. Теоретично, CGI дозволяє розширити можливості сервера щодо аналізу (інтерпретації) введення, що надходить від браузера, і повертати інформацію, засновану на введеній інформації користувача. На практичному рівні CGI - це інтерфейс, що дозволяє програмісту записати програми, які легко зв'язуються із сервером.

Зазвичай, для розширення можливостей сервера Вам довелося б самому модифікувати сервер. Таке рішення небажане, тому що це потребує розуміння нижнього рівня мережевого програмування за протоколом Інтернету. Це також вимагало б редагування та перекомпіляції вихідного коду сервера або запису сервера користувача для кожної задачі. Допустимо, потрібно розширити можливості сервера так, щоб він діяв як шлюз Web-to-e-mail (від Веб до електронної пошти), відбираючи інформацію, введену користувачем, з браузера та посилаючи її по електронній поштііншому користувачеві. У сервер довелося б вставити код для аналізу введення від браузера, пересилання його електронною поштою іншому користувачеві, і пересилання відповіді назад у браузер через мережеве з'єднання.

По-перше, таке завдання вимагає доступу до коду сервера, що не завжди можливо.

По-друге, це важко і потребує великих технічних знань.

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

Чому CGI?

CGI пропонує переносне і просте вирішення цих проблем. Протокол CGI визначає стандартний спосіб програм, щоб зв'язатися з сервером Веб. Без будь-яких спеціальних знань, можна записати програму будь-якою машинною мовою, яка сполучається та зв'язується з сервером Веб. Ця програма буде працювати з усіма серверами Інтернет, які розуміють протокол CGI.

Зв'язок CGI здійснюється стандартним введенням та висновком, що означає, що, якщо Ви знаєте, як друкувати та читати дані, використовуючи свою мову програмування, можна написати програму сервера Веб. Крім аналізу введення та виведення, програмування додатків CGI майже еквівалентне програмуванню будь-якої іншої програми. Наприклад, для програмування програми Hello, World! використовуються функції друку вашої мови та формат, визначений для програм CGI, щоб надрукувати відповідне повідомлення.

Вибір мови програмування

Оскільки CGI - універсальний інтерфейс, Ви не обмежені будь-якою певною машинною мовою. Часто ставлять питання: які мови програмування можна використовувати для програмування CGI? Ви можете використовувати будь-яку мову, яка дозволяє робити наступне:

  • Друкувати у стандартному висновку
  • Читати зі стандартного введення
  • Читати зі змінних режимів

Майже всі мови програмування та багато мов опису сценарію виконують ці три дії, і можна використовувати будь-яку з них.

Мови підпадають під один із наступних двох класів: трансльований та інтерпретований. Трансльована мова -наприклад, C або C++ зазвичай менше і швидше, в той час як інтерпретовані мови, такі як Perl або Rexx, іноді вимагають завантаження великого інтерпретатора після запуску. Додатково, Ви можете розподіляти двійкові коди (код, що транслюється в машинну мову) без вихідного коду, якщо ваша мова транслюється. Розподіл інтерпретованих сценаріїв зазвичай означає розподіл вихідного коду.

Перед тим, як вибрати мову, потрібно спочатку розглянути свої пріоритети. Потрібно оцінити вигоди від швидкості та ефективності однієї мови програмування з легкістю програмування іншої. Якщо у Вас є бажання вивчити іншу мову, замість використання тієї, яку Ви вже знаєте, ретельно звести переваги та недоліки обох мов.

Дві мови, які найчастіше використовуються для програмування CGI - це C і Perl (обидві з яких розглядаються в цій книзі). В обох є чіткі переваги та недоліки. Perl - мова дуже високого рівня, і в той же час потужна мова, особливо придатна для синтаксичного аналізу тексту. Хоча легкість використання, гнучкість і потужність робить його мовою, привабливою для програмування CGI, його відносно великий розмір і більш повільна робота іноді робить його невідповідним для деяких додатків. Програми C менші за розміром, більш ефективні та забезпечують контроль за системою нижчого рівня, але складніші для програмування, не мають легких вбудованих підпрограм обробки тексту, та їх важче налагодити.

Яка мова є найбільш підходящою для програмування CGI? Той, який Ви вважаєте собі зручнішим з погляду програмування. Обидва однаково ефективні для програмування додатків CGI, і з належними бібліотеками обидва мають схожі можливості. Однак, якщо Ви маєте важкодоступний сервер, можна використовувати менші програми C, які транслюються. Якщо Ви повинні швидко написати програму, яка вимагає значної роботи з обробки тексту, можна замість нього використовувати Perl.

Застереження

Є деякі важливі альтернативи до програм CGI. Багато серверів тепер включають API-програмування, яке полегшує програмування прямих розширень сервера на противагу окремим програмам CGI. Сервери API зазвичай ефективніші, ніж програми CGI. Інші сервери включають вбудовані функціональні можливості, які можуть обробляти спеціальні елементи без CGI, наприклад, поєднання баз даних. І, нарешті, деякі програми можуть бути оброблені деякими новими клієнтськими (а не серверними) технологіями типу Java. Чи швидко застаріє CGI в умовах таких швидких змін у технології?

Навряд чи. CGI має кілька переваг перед новими технологіями.

  • Він універсальний та переносимий. Ви можете написати програму CGI, використовуючи практично будь-яку мову програмування на будь-якій платформі. Деякі альтернативи, такі як API сервера, обмежують Вас деякими мовами і набагато складніші для вивчення.
  • Малоймовірно, що клієнтські технології типу Java, замінять CGI, тому що є деякі програми, для яких серверні програми набагато краще підходять для виконання.
  • Багато обмежень CGI - це обмеження HTML або HTTP. У міру розвитку стандартів Інтернету в цілому розвиваються й можливості CGI.

Резюме

Загальношлюзовий інтерфейс - це протокол, відповідно до якого програми взаємодіють із серверами Інтернет. Універсальність CGI дає програмістам можливість написати шлюзові програми майже будь-якою мовою, хоча є багато компромісних рішень, пов'язаних з різними мовами. Без цієї здатності, створення інтерактивних сторінок Веб було б утруднено, в кращому випадку, знадобилася б модифікація сервера, і інтерактивність виявилася б недоступною для більшості користувачів, які не є адміністраторами сайту.

Глава 2. Основи

Кілька років тому, я створював для коледжу в Гарварді сторінку, куди можна було б представити свої коментарі про них. На той час Інтернет був молодий, а документації було мало. Я, подібно до багатьох інших, спирався на коротку документацію та систему програмування, створену іншими, щоб навчитися програмування CGI. Хоча цей метод вивчення зажадав певного пошуку, багатьох експериментів, і створював багато питань, він був дуже ефективним. Справжній розділ - плід моєї роботи з CGI на ранніх етапах (з кількома уточненнями, зрозуміло).

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

Мета цього розділу полягає в тому, щоб уявити основи CGI у комплексному, хоч і стислому вигляді. Кожна концепція, яку розглядають тут, детально представлена ​​в наступних розділах. Однак, після вивчення цього розділу, можна відразу розпочати програмування додатків CGI. Як тільки Ви досягнете цього рівня, можна вивчити тонкощі CGI або прочитавши решту цієї книги, або просто експериментуючи самостійно.

Ви можете звести програмування CGI до двох завдань: отримання інформації від браузера Веб і відсилання інформації назад на браузер. Це робиться досить інтуїтивно, як тільки Ви зрозумієте звичайне використання програм CGI. Часто користувачеві пропонують заповнити будь-яку форму, наприклад, вставити своє ім'я. Як тільки користувач заповнює форму та натискає Enter, ця інформація надсилається програмі CGI. Програма CGI повинна потім перетворити цю інформацію на те, що вона розуміє, відповідно обробити її, і потім послати назад браузеру, будь то просте підтвердження або результат пошуку в багатоцільовій базі даних.

Іншими словами, для програмування CGI потрібно зрозуміти, як отримати введення від Інтернет-браузера і як надіслати висновок назад. Що відбувається між стадіями введення та виведення програми CGI залежить від мети розробника. Ви виявите, що головна складність програмування CGI полягає у цій проміжній стадії; після того, як Ви дізнаєтесь, як працювати з введенням та висновком, цього буде, по суті, достатньо, щоб стати розробником CGI.

У цьому Розділі Ви вивчите принципи, що лежать в основі введення та виведення CGI, а також інші елементарні навички, які потрібно, щоб записувати та використовувати CGI, включаючи такі моменти, як створення форм HTML та присвоєння імені вашим програмам CGI. У цьому розділі розглядаються такі темы:

  • Традиційна програма "Hello, World!";
  • Висновок CGI: надсилання інформації назад для відображення в Інтернет-браузері;
  • Конфігурування, встановлення та виконання програми. Ви дізнаєтеся про різні платформи та сервери Веб;
  • Введення CGI: інтерпретація інформації, надісланої браузером Веб. ознайомлення з деякими корисними бібліотеками програмування для аналізу такого введення;
  • Найпростіший приклад: він охоплює всі уроки цього розділу;
  • Стратегія програмування.

Через характер цієї глави, я лише злегка торкаюся деяких тем. Не хвилюйтеся; всі ці теми розглядаються набагато глибше в інших розділах.

Hello, World!

Ви починаєте з традиційної вступної задачі програмування. Ви напишете програму, яка відобразить "Hello, World!" на вашому браузері Веб. Перш ніж написати цю програму, Ви повинні зрозуміти, яку інформацію браузер Веб очікує отримати від програм CGI. Ви також повинні знати, як виконати цю програму, щоб побачити її в дії.

CGI залежить від мови, так що Ви можете реалізувати цю програму будь-якою мовою. Тут використовується кілька різних мов, щоб продемонструвати незалежність кожної мови. У мові Perl, програма "Hello,World!" показано у лістингу 2.1.

Лістинг 2.1. Hello, World! у Perl. #!/usr/local/bin/perl # Hello.cgi - Моя перша програма CGI print "Content-Type: text/html\n\n"; print " \n"; print " Hello, World!"; print"\n"; print " \n"; print "

Hello, World!

\n"; print "

\n";

Збережіть цю програму як hello.cgi та встановіть її у відповідному місці. (Якщо Ви не впевнені, де воно знаходиться, не турбуйтеся; Ви дізнаєтеся про це в розділі "Встановлення та виконання програми CGI" нижче в цьому розділі.) Для більшості серверів потрібний каталог називається cgi-bin. Тепер викличте програму з вашого браузера Веб. Для більшості це означає відкрити наступний універсальний покажчик ресурсу (URL):

http://hostname/directoryname/hello.cgi

Hostname - ім'я вашого сервера Веб, і directoryname - каталог, у якому Ви поміщаєте hello.cgi (ймовірно cgi-bin).

Розбиття hello.cgi

Слід зазначити кілька моментів щодо hello.cgi.

По-перше, ви використовуєте прості команди друку. Програми CGI не вимагають жодних спеціальних дескрипторів файлу або описників виводу. Щоб надіслати висновок браузеру, просто друкують на stdout.

По-друге, зверніть увагу, що зміст першого оператора друку (Content-Type: text/html) не з'являється на вашому браузері Веб. Ви можете надіслати будь-яку інформацію, на Ваш розсуд, назад на браузер (сторінку HTML, графіку або звук), але спочатку потрібно повідомити браузеру якого виду дані ви йому посилаєте. Цей рядок повідомляє браузеру, який вид інформації очікувати - в даному випадку, сторінку HTML.

По-третє, програма називається hello.cgi. Не завжди потрібно використовувати розширення.cgi з ім'ям програми CGI. Хоча вихідний код для багатьох мов також використовує розширення.cgi, воно не використовується для позначення типу мови, а є для сервера способом ідентифікації файлу як виконуваного файлу, а не графічного файлу, HTML або текстового файлу. Сервери часто конфігуруються так, щоб тільки спробувати виконати ті файли, які мають це розширення, відображаючи зміст усіх інших. Хоча використання розширення.cgi не обов'язково, це все ще вважається гарною практикою.

Загалом hello.cgi складається з двох основних частин:

  • повідомляє браузеру яку інформацію очікувати (Content-Type: text/html)
  • повідомляє браузеру, що відобразити (Hello, World!)

Hello, World! в C

Щоб показати незалежність програм CGI від мов, у лістингу 2.2 показаний еквівалент програми hello.cgi, написаної C.

Лістинг 2.2. Hello, World! в C. /* hello.cgi.c - Hello, World CGI */ #include int main() ( printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); printf(" Hello, World!\n"); printf("\n"); printf(" \n"); printf("

Hello, World!

\n"); printf("

\n"); )

Примітка

Зверніть увагу, що версія Perl hello.cgi використовує Content-Type print ": text/html\n\n "; У той час як версія C використовує Printf ("Content-Type: text/html\r\n\r\n");

Чому Perl друкує операторний кінець із двома символами нового рядка (\n), тоді як C printf закінчується двома символами повернення каретки та нового рядка(\r\n)?

Формально, заголовки (весь висновок перед порожнім рядком), як передбачається, будуть відокремлені символом повернення каретки та нового рядка. На жаль, на машинах DOS і Windows Perl транслює як інший новий рядок, а не як переклад каретки.

Хоча виключення \rs у Perl технічно неправильне, вона працюватиме майже у всіх протоколах і переноситься всіма платформами. Тому у всіх прикладах Perl у цій книзі я використовую новий рядок, що відокремлюють заголовки, а не символи повернення каретки та нового рядка.

Відповідне вирішення цієї проблеми представлено у Розділі 4, "Висновок".

Ні серверу Веб, ні браузеру не важливо, яка мова використовується для запису програми. Хоча кожна мова має переваги та недоліки в якості мови програмування CGI, краще використовувати мову, з якою Вам найзручніше працювати. (Докладніше вибір мови програмування обговорюється в Главі 1 "Загальношлюзовий інтерфейс (CGI) ").

Виведення CGI

Тепер можна уважніше вивчити питання надсилання інформації на веб-браузер. З прикладу Hello, World! видно, що браузери Веб очікують два набори даних: заголовок, який містить інформацію, наприклад яку інформацію відобразити (наприклад Content-Type: line) і фактичну інформацію (що відображається на браузері Веб). Ці два блоки інформації відокремлені порожнім рядком.

Заголовок називається заголовком HTTP. Він дає важливу інформацію про інформацію, яку браузер збирається отримувати. Є кілька різних типів заголовків HTTP, і найбільш універсальним є той, який Ви використовували раніше: Content-Type: заголовок. Ви можете використовувати різні комбінації заголовків HTTP, відокремлюючи їх символами повернення каретки та нової лінії (\r\n). Порожній рядок, що відокремлює заголовок від даних, також складається з повернення каретки та нового рядка (чому потрібні обидва, коротко описані в попередньому примітці та докладно в Розділі 4). Ви дізнаєтеся про інші заголовки HTTP у Розділі 4; в даний момент ви займаєтеся Content-Type: заголовок.

Content-Type: назва описує тип даних, які повертає CGI. Відповідним форматом для цього заголовка є:

Content-Type: subtype/type

Де subtype/type – правильний тип багатоцільових розширень пошти Інтернету (MIME). Найбільш поширеним типом MIME є HTML: text/html. У таблиці 2.1 наведено ще кілька поширених типів MIME, які будуть розглянуті; Більш повний список та аналіз типів MIME наводиться в Главі 4.

Примітка

MIME було спочатку винайдено для опису змісту повідомлень пошти. Воно стало досить поширеним способом подання інформації про Content-Type. Ви можете дізнатися більше про MIME в RFC1521. RFCs в Інтернеті позначають "Прохання про коментарі", які є резюме рішень, прийнятих групами в Інтернеті, які намагаються встановити стандарти. Можна переглянути результати RFC1521 на наступній адресі: http://andrew2.andrew.cmu.edu/rfc/rfc1521.html

Таблиця 2.1. Деякі спільні типи MIME. Тип MIME Опис Text/html Мова гіпертекстової розмітки (HTML) Text/plain Прості текстові файли Image/gif Графічні файли GIF Image/jpeg Стисні графічні файли JPEG Audio/basic Аудіо - файли Sun *.au Audio/x-wav Файли Windows *. wav

Після заголовка та порожнього рядка, Ви просто друкуєте дані у потрібному для Вас вигляді. Якщо ви надсилаєте HTML, то друкуйте теги HTML і дані до stdout після заголовка. Ви можете надіслати також графіку, звук та інші двійкові файли, просто друкуючи вміст файлу в stdout. Декілька прикладів цього наведено в Розділі 4.

Встановлення та виконання програми CGI

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

Усі сервери потребують простору для файлів сервера та простору для документів HTML. У цій книзі область сервера називається ServerRoot, а область документа - DocumentRoot. На машинах UNIX ServerRoot - зазвичай /usr/local/etc/httpd/, а DocumentRoot - зазвичай /usr/local/etc/httpd/htdocs/. Однак, це не має значення для вашої системи, тому замініть всі посилання на ServerRoot і DocumentRoot на власні ServerRoot і DocumentRoot.

Коли Ви звертаєтесь до файлів, використовуючи ваш браузер Веб, Ви визначаєте файл в URL щодо DocumentRoot. Наприклад, якщо адреса вашого сервера mymachine.org, Ви звертаєтеся до цього файлу з наступною URL: http://mymachine.org/index.html

Конфігурація сервера для CGI

Більшість серверів Інтернет має таку попередню конфігурацію, яка дозволяє використовувати програми CGI. Зазвичай два параметри вказують серверу про те, є файл додатком CGI чи ні:

  • Позначений каталог. Деякі сервери дозволяють визначити, що всі файли в позначеному каталозі (зазвичай за замовчуванням cgi-bin) є CGI.
  • Розширення імені файлу. Багато серверів мають таку попередню конфігурацію, яка дозволяє визначати всі файли, що закінчуються на .cgi, як CGI.

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

  • Він зберігає програми CGI у централізованому вигляді, перешкоджаючи захаращення інших каталогів.
  • Ви не обмежені певним розширенням імені файлу, так що можете називати файли так, як хочете. Деякі сервери дозволяють позначити кілька різних каталогів як каталоги CGI.
  • Він також дає більше можливостей щодо контролю над тими, хто може записувати CGI. Наприклад, якщо Ви маєте сервер і підтримуєте систему з кількома користувачами і не хочете, щоб вони використовували свої власні сценарії CGI без попередньої ревізії програми з міркувань безпеки, можна позначити лише ці файли в обмеженому централізованому каталозі як CGI. Користувачі тоді повинні будуть надати Вам програми CGI для встановлення і Ви зможете спочатку провести ревізію коду, щоб переконатися, що програма не має жодних великих проблем із захистом.

Позначення CGI через розширення імені файлу може бути корисним завдяки його гнучкості. Ви не обмежені єдиним каталогом для програм CGI. Більшість серверів може бути конфігуровано, щоб розпізнати CGI через розширення імені файлу, хоча за замовчуванням не всі конфігуровані таким чином.

Застереження

Пам'ятайте про важливість питань захисту, коли ви конфігуруєте ваш сервер для CGI. Деякі підказки будуть розглянуті тут, а розділ 9 "Захист CGI" ці аспекти розглядаються докладніше.

Встановлення CGI на серверах UNIX

Незалежно від того, як конфігурований ваш сервер UNIX, потрібно зробити кілька кроків, щоб переконатися, що ваші програми CGI виконуються належним чином. Ваш сервер Веб зазвичай буде працювати як неіснуючий користувач (тобто користувач UNIX nobody - обліковий запис, який не має права доступу до файлу і не може бути зареєстрований). Сценарії CGI (написані на Perl, оболонці Bourne або іншою мовою опису сценарію) повинні бути здійсненні та читані по всьому світу.

Підказка

Щоб зробити ваші файли читаними та здійсненними по всьому світу, використовуйте наступну команду UNIX права доступу: chmod 755 імені файлу.

Якщо Ви використовуєте мову опису сценарію типу Perlабо Tcl, вкажіть повний шлях інтерпретатора в першому рядку вашого сценарію. Наприклад, сценарій Perl, який використовує perl у каталозі /usr/local/bin, повинен починатися з наступного рядка:

#!/usr/local/bin/perl

Застереження

Ніколи не поміщайте інтерпретатор (perl, або двійковий код Tcl Wish до каталогу /cgi-bin. Це створює небезпеку для захисту у Вашій системі. Докладніше описано в Розділі 9.

Деякі універсальні сервери UNIX

Сервери NCSA та Apache мають файли зі схожою конфігурацією, тому що сервер Apache був спочатку заснований на коді NCSA. За замовчуванням вони конфігуровані таким чином, щоб будь-який файл у каталозі cgi-bin (розташований за промовчанням в ServerRoot) був програмою CGI. Щоб змінити розташування каталогу cgi-bin, можна відредагувати конфігураційний файл conf/srm.conf. Форматом для конфігурування цього каталогу є

ScriptAlias ​​fakedirectoryname realdirectoryname

де fakedirectoryname - псевдо-ім'я каталогу (/cgi-bin), і realdirectoryname - повний шлях, де програми CGI фактично збережені. Ви можете конфігурувати більше одного ScriptAlias, додаючи ще рядки ScriptAlias.

За замовчуванням конфігурація достатня для потреб більшості користувачів. Потрібно відредагувати рядок у файлі srm.conf у будь-якому випадку, щоб визначити правильний реальнийdirectoryname. Якщо, наприклад, Ваші програми CGI розташовані в /usr/local/etc/httpd/cgi-bin, рядок ScriptAlias ​​у вашому файлі srm.conf повинен бути схожим на:

ScriptAlias ​​/cgi-bin/ /usr/local/etc/httpd/cgi-bin/

Щоб звертатися або посилатися на програми CGI, розташовані в цьому каталозі, використовується наступна URL:

http://hostname/cgi-bin/programname

Де hostname – ім'я господаря вашого сервера Веб, та programname – ім'я Вашого CGI.

Наприклад, припустимо, що Ви скопіювали програму hello.cgi до Вашого каталогу cgi-bin (наприклад, /usr/local/etc/httpd/cgi-bin) на Вашому сервері Веб, званому www.company.com. Щоб звернутися до вашого CGI, використовуйте наступну URL-адресу: http://www.company.com/cgi-bin/hello.cgi

Якщо потрібно конфігурувати сервер NCSA або Apache так, щоб розпізнавати будь-який файл з розширенням.cgi як CGI, потрібно відредагувати два конфігураційні файли. Спочатку, у файлі srm.conf, не коментуйте наступний рядок:

AddType application/x-httpd-cgi .cgi

Це зв'яже CGI типу MIME із розширенням.cgi. Тепер потрібно змінити файл access.conf, щоб можна було виконати CGI у будь-якому каталозі. Для цього додайте опцію ExecCGI до рядка Option. Це буде виглядати приблизно як наступний рядок:

Option Indexes FollowSymLinks ExecCGI

Тепер будь-який файл з розширенням.cgi вважається CGI; звертайтеся до нього, як зверталися до будь-якого файлу на вашому сервері.

Сервер CERN конфігурований так само, як і сервери Apache та NCSA. Замість ScriptAlias ​​сервер CERN використовує команду Exec. Наприклад, у файлі httpd.conf Ви побачите наступний рядок:

Exec /cgi-bin/* /usr/local/etc/httpd/cgi-bin/*

Інші сервери UNIX можна конфігурувати у такий самий спосіб; докладніше про це описано в документації сервера.

Встановлення CGI на Windows

Більшість серверів, доступних для Windows 3.1, Windows 95 і Windows NT, конфігуровано за допомогою методу "розширення імені файлу" для розпізнавання CGI. Взагалі зміна конфігурації сервера на базі Windows просто вимагає виконання програми конфігурації сервера та внесення відповідних змін.

Іноді конфігурування сервера для правильного виконання сценарію (типу Perl) є складною справою. У DOS або Windows Ви не зможете визначити інтерпретатор на першому рядку сценарію, як це відбувається при роботі з UNIX. Деякі сервери мають задану конфігурацію, щоб зв'язати деякі розширення імені файлу з інтерпретатором. Наприклад, багато веб-серверів Windows припускають, що файли, що закінчуються на.pl, є сценаріями Perl.

Якщо сервер не виконує такий тип асоціації файлу, можна визначити пакетний файл пакувальника, який викликає як інтерпретатор, так і сценарій. Як і з сервером UNIX, не встановлюйте інтерпретатор ні в каталозі cgi-bin ні в будь-якому Веб-доступному каталозі.

Встановлення CGI на Macintosh

Дві найбільш відомі опції сервера для Macintosh – це WebStar StarNine та його попередник MacHTTP. Обидва розпізнають CGI розширення імені файлу.

MacHTTP розуміє два різні розширення: .cgi і.acgi, який позначає асинхронний CGI. Регулярні програми CGI, встановлені на Macintosh (з розширенням.cgi), будуть підтримувати Веб-сервер у стані зайнятості, доки не закінчиться виконання CGI, змушуючи сервер призупинити виконання всіх інших запитів. Асинхронний CGI, з іншого боку, дозволяє серверу приймати запити навіть під час своєї роботи.

Розробник CGI Macintosh, який використовує будь-який із цих Веб-серверів, повинен, по можливості, використовувати просто розширення.acgi, а не розширення.cgi. Воно має працювати з більшістю програм CGI; якщо воно не працює, перейменуйте програму на .cgi.

Виконання CGI

Після того, як ви встановили CGI, є кілька способів його виконання. Якщо ваш CGI -програма, що працює тільки з висновком, типу програми Hello,World!, тоді Ви можете виконувати її, просто звертаючись до її URL-адреси.

Більшість програм виконується як серверний додаток до форми HTML. Перш ніж навчитися, як отримувати інформацію від цих форм, спочатку прочитайте короткий вступ про створення таких форм.

Швидка навчальна програма за формами HTML

Два найбільш важливі теги у формі HTML - це теги

і . Можна створювати більшість форм HTML, використовуючи лише ці два теги. У цьому розділі, Ви вивчите ці теги та невелике підмножина можливих типів або атрибутів . Повне керівництво та посилання на форми HTML знаходяться у Розділі 3 "HTML і форми".

Тег

Тег використовується для визначення того, яка частина HTML-файлу повинна бути використана для інформації, введеної користувачем. Тут мається на увазі, як більшість сторінок HTML викликає програму CGI. Атрибути тега визначають ім'я програми та місцезнаходження - або локально, або як повний URL, тип кодування, що використовується, і метод переміщення даних, що використовуються програмою.

Наступний рядок показує специфікації для тега :

< ACTION FORM = "url" METHOD = ENCTYPE = "..." >

Атрибут ENCTYPE не відіграє особливої ​​ролі і зазвичай не вмикається з тегом . Детальна інформаціящодо тега ENCTYPE дано у Розділі 3. Один із способів використання ENCTYPE, показаний у Главі 14 "Фірмові розширення."

Атрибут ACTION посилається на URL програми CGI. Після того, як користувач заповнить форму та надасть інформацію, вся інформація кодується та передається програмі CGI. Програма CGI вирішує сама питання про декодування та обробку інформації; цей аспект розглядається в "Прийняття введення від браузера" нижче в цьому розділі.

Нарешті, атрибут METHOD описує, як програма CGI має отримувати введення. Ці два методи – GET і POST – відрізняються щодо того, як передавати інформацію програмі CGI. Обидва обговорені в "Прийняття введення від браузера."

Щоб браузер зміг дозволити введення інформації користувачем, всі теги форм та інформація повинні бути оточені тегом . Не забудьте завершальний тег

для позначення кінця форми. Не можна мати форму всередині форми, хоча Ви можете встановити форму, яка дозволяє представляти частини інформації у різних місцях; цей аспект широко розглядається у Розділі 3.

Тег

Ви можете створювати смужки введення тексту, кнопки "radio", вікна прапорців та інші засоби прийняття введення, використовуючи тег . У даному розділірозглядаються лише поля текстового введення. Для реалізації цього поля використовуйте тег з наступними атрибутами:

< INPUT TYPE=text NAME = "... " VALUE = "... " SIZE = MAXLENGTH = >

NAME – символічне ім'я змінної, яка містить значення, введене користувачем. Якщо Ви включаєте текст до атрибуту VALUE, цей текст буде поміщений як заданий за промовчанням у полі текстового введення. Атрибут SIZE дозволяє визначити горизонтальну довжину поля введення, оскільки він буде з'являтися у вікні браузера. І нарешті, MAXLENGTH визначає максимальна кількістьсимволів які користувач може ввести в поле. Зауважте, що атрибути VALUE, SIZE, MAXLENGTH є необов'язковими.

Подання форми

Якщо Ви маєте лише одне текстове поле в межах форми, користувач може подати форму, просто набираючи інформацію на клавіатурі та натискаючи Enter. В іншому випадку, має бути якийсь інший спосіб подання інформації користувачем. Користувач надає інформацію, використовуючи кнопку для подання з наступним тегом:

< Input type=submit >

Цей тег створює всередині форми кнопку Submit. Коли користувач закінчує заповнення форми, він або вона може відправити її зміст по адресою URL, зазначеному атрибутом ACTIONформи, клацнувши кнопку Submit.

Прийняття введення від браузера

Вище були дані приклади запису програми CGI, яка посилає інформацію з сервера на браузер. Насправді програма CGI, яка лише виводить дані, не має багато додатків (деякі приклади наведені в Розділі 4). Більш важливою здатністю CGI є отримання інформації від браузера - особливість, яка надає Інтернет інтерактивного характеру.

Програма CGI одержує два види інформації від браузера.

  • По-перше, вона отримує різні частини інформації про браузер (його тип, що він може переглядати, хост господаря, і так далі), сервера (його ім'я та версія, порт його виконання, і так далі), і безпосередньо про програму CGI ( ім'я програми та де вона розташована). Сервер дає всю цю інформацію програмі CGI через змінні середовища.
  • По-друге, програма CGI може отримувати інформацію, введену користувачем. Ця інформація після кодування браузером надсилається або через змінне середовище (метод GET), або через стандартне введення (stdin-метод POST).

Змінні середовища

Корисно знати, які змінні середовища доступні для програми CGI, як у процесі навчання, так і для налагодження. У таблиці 2.2 наведено деякі з доступних змінних середовища CGI. Можна також записати програму CGI, яка виводить змінні середовища та їх значення на веб-браузер.

Таблиця 2.2. Деякі важливі змінні середовища CGI Змінна середовища Мета REMOTE_ADDR IP адреса машини клієнта. REMOTE_HOST Хост господаря машини клієнта. HTTP _ACCEPT Перераховує типи MIME даних, які браузер вміє інтерпретувати. HTTP _USER_AGENT Інформація браузера (тип браузера, номер версії, операційна система, і т.д.). REQUEST_METHOD GET чи POST. CONTENT_LENGTH Розмір введення, якщо він надісланий через POST. Якщо немає введення або якщо використовується метод GET, цей параметр не визначено. QUERY_STRING Містить інформацію, що вводиться, коли вона передається за допомогою методу GET. PATH_INFO Дозволяє користувачеві визначити шлях від командного рядка CGI (наприклад, http://hostname/cgi-bin/programname/path). PATH_TRANSLATED Транслює відносний шляхв PATH_INFO у фактичний шлях у системі.

Щоб записати програму CGI, яка відображає змінні середовища, потрібно знати, як виконати дві речі:

  • Визначити всі змінні середовища та їх відповідні значення.
  • Вивести результати для браузера.

Ви вже знаєте, як виконувати останню операцію. У Perl змінні середовища зберігаються в асоціативному масиві %ENV, який вводиться ім'ям змінного середовища. Лістинг 2.3 містить env.cgi, програму Perl, яка є досягнення нашої мети.

Лістинг 2.3. Програма Perl, env.cgi, яка виводить усі змінні середовища CGI.

#!/usr/local/bin/perl print "Content-type: text/html\n\n"; print " \n"; print " CGI Environment\n"; print "\n"; print " \n"; print "

CGI Environment

\n"; foreach $env_var (keys %ENV) ( print " $env_var= $ENV($env_var)
\n"; ) print "

\n";

Подібна програма може бути написана C; повний кодзнаходиться у Лістингу 2.4.

Лістинг 2.4. Env.cgi.c у C. /* env.cgi.c */ #include extern char **environ; int main() (char **p = environ; printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); printf(" CGI Environment\n"); printf("\n"); printf(" \n"); printf("

CGI Environment

\n"); while(*p != NULL) printf("%s
\n",*p++); printf("

\n"); )

GET або POST?

Яка різниця між методами GET та POST? GET передає закодований вхідний рядок через змінне середовище QUERY_STRING, а POST передає його через stdin. POST - кращий метод, особливо для форм з великою кількістюданих, тому що тут немає будь-яких обмежень щодо обсягу посиланої інформації, а при метод GETобсяг простору середовища обмежений. GET має однак певний корисна властивість; це докладно у Главі 5 " Введення " .

Щоб визначити, який метод використовується, програма CGI перевіряє змінне середовище REQUEST_METHOD, яке буде встановлене або в GET, або в POST. Якщо вона встановлена ​​в POST, довжина закодованої інформації збережена в змінному середовищі CONTENT_LENGTH.

Закодований Введення

Коли користувач передає форму, браузер спочатку кодує інформацію перед надсиланням її на сервер, а потім на програму CGI. Коли Ви використовуєте тег кожному полю надають символічне ім'я. Значення, введене користувачем, видається як значення змінної.

Щоб визначити це, браузер використовує кодуючу специфікацію URL, яка може бути описана таким чином:

  • Відокремлює різні поля амперсандом (&).
  • Відокремлює ім'я та значення знаками рівності (=), з ім'ям зліва та значенням праворуч.
  • Замінює пропуски знаками "плюс" (+).
  • Замінює всі "ненормальні" символи знаком відсотка (%), за яким слідує двозначний шістнадцятковий кодсимвол.

Ваш кінцевий закодований рядок буде схожим на наступний:

Name1=value1&name2=value2&name3=value3 ...

Примітка: Специфікації для кодування URL знаходяться в RFC1738.

Наприклад, припустимо, що у вас була форма, яка запросила ім'я та вік. Код HTML, який використовувався для відображення цієї форми, представлений у лістингу 2.5.

Лістинг 2.5. Код HTML для відображення форми імені та віку.

Name and Age

Enter your name:

Enter your age:



Припустимо, що користувач вводить Joe Schmoe у поле імені, і 20 – у вікове поле. Введення буде закодовано у вхідному рядку.

Name=Joe+Schmoe&age=20

Синтаксичний аналіз введення

Для того, щоб ця інформація була корисною, потрібно використовувати інформацію на щось таке, що може бути використане вашими програмами CGI. Стратегії синтаксичного аналізу введення розглядаються в Розділі 5. Практично Вам ніколи не доведеться думати про те, як аналізувати введення, тому що кілька фахівців вже написали доступні для всіх бібліотеки, які проводять синтаксичний аналіз. Дві такі бібліотеки представлені в цьому розділі в наступних розділах: cgi -lib.pl для Perl (написані Стівом Бреннером) та cgihtml для C (написані мною).

Загальна мета більшості бібліотек, написаних різними мовами, полягає в тому, щоб аналізувати закодований рядок і поміщати пари імен та значень у структуру даних. Є очевидна перевага у використанні мови, що має вбудовані структури даних типу Perl; проте більшість бібліотек для мов нижчого рівнятипу C і C++ включає виконання структури даних та підпрограми.

Не обов'язково добиватися повного розуміння бібліотек; набагато важливіше навчитися використовувати їх як інструментальні засоби, щоб спростити роботу програміста CGI

Cgi-lib.pl

Cgi-lib.pl використовує асоціативні масиви Perl. Функція &ReadParse аналізує вхідний рядок та вводить кожну пару "ім'я/значення" на ім'я. Наприклад, відповідними рядками Perl, необхідними для декодування щойно представленого вступного рядка "ім'я / вік", були б

&ReadParse(*input);

Тепер, щоб побачити значення, введене для "імені", можна звертатися до асоціативному масиву$input ("ім'я"). Так само, щоб звернутися до значення "віку", потрібно подивитися на змінну $input ("вік").

Cgihtml

C не має ніяких вбудованих структур даних, так що cgihtml здійснює свій власний списокзв'язків для використання зі своїми підпрограмами CGI, що аналізують. Це визначає структуру елементатипу наступним чином:

Typedef struct ( Char *name; Char *value; ) Entrytype;

Щоб проаналізувати вступний рядок "name / age" ("ім'я / вік") в C, використовуючи cgihtml, використовується таке:

/* оголосити пов'язаний список, званий введенням */ Llist input; /* аналізувати введення та місце у зв'язаному списку */ read_cgi_input(&input);

Щоб звернутися до інформації про вік, можна проаналізувати список вручну, або використовувати функцію cgi _val ().

#include #include Char * age = malloc (sizeof (char) * strlen (cgi _val (input, "age")) + 1); Strcpy (age, cgi _val (input, "age"));

Значення "віку" тепер збережено у рядку age.

Примітка: Замість використання простого масиву(подібно до char age ;), я займаюся динамічним розподіломпростір пам'яті для рядка age. Хоча це ускладнює програмування, проте це важливо з погляду безпеки. Докладніше про це йдеться у Розділі 9.

Проста програма CGI

Ви збираєтеся записати програму CGI, яка називається nameage.cgi, яка обробляє форму "ім'я / вік". Обробка даних (що зазвичай називаю " проміжним матеріалом " ) мінімальна. Nameage.cgi просто декодує введення та відображає ім'я користувача та вік. Хоча не надто багато користі від такого інструменту, він демонструє найбільш критичний аспект програмування CGI: введення та виведення.

Ви використовуєте ту саму форму, як описано вище, викликаючи поля "ім'я та вік". Поки що не варто турбуватися про помилкостійкість та ефективність; розв'яжіть завдання найпростішим чином. Рішення Perl і C показані відповідно в лістингах 2.6 і 2.7.

Лістинг 2.6. Nameage.cgi у Perl

#!/usr/local/bin/perl # nameage.cgi require "cgi-lib.pl" &ReadParse(*input); print "Content-Type: text/html\r\n\r"; print " \n"; print " Name and Age\n"; print "\n"; print " \n"; print "Hello, " . $input("name") . ". You are\n"; print $input("age") . " years old.

\n"; print "

\n";

Лістинг 2.7. nameage.cgi в C

/* nameage.cgi.c */ #include #include "cgi-lib.h" int main() ( llist input; read_cgi_input(&input); printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); printf(" Name and Age\n"); printf("\n"); printf(" \n"); printf("Hello, %s. You are\n",cgi_val(input,"name"));

\n", cgi_val(input,"age")); printf("

\n"); )

Зверніть увагу, що ці дві програми майже еквівалентні. Вони обидві містять підпрограми синтаксичного аналізу, які займають лише один рядок та обробляють все введення (завдяки відповідним бібліотечним підпрограмам). Висновок по суті є зміненою версією вашої основної програми Hello, World!.

Спробуйте виконати програму, заповнюючи форму та натискаючи кнопку Submit.

Загальна стратегія програмування

Тепер ви знаєте всі основні принципи, необхідні для програмування CGI. Коли Ви розумієте, як CGI отримує інформацію і як він відсилає її назад браузеру, фактична якість кінцевого продукту залежить від ваших загальних здібностей до програмування. А саме, коли Ви програмуєте CGI (або взагалі що-небудь, якщо вже на те пішло), пам'ятайте про такі якості:

  • Простота
  • Ефективність
  • Універсальність

Перші дві якості досить поширені: намагайтеся зробити код якомога більш читаним та ефективним. Універсальність більше відноситься до програм CGI, ніж до інших програм. Коли Ви почнете розробляти свої власні програми CGI, Ви дізнаєтеся, що є кілька основних програм, які хоче зробити кожен. Наприклад, одним з найбільш поширених і очевидних завдань програми CGI є обробка форми та надсилання електронною поштою результатів певному одержувачу. Ви можете мати кілька окремих оброблених форм, кожна з різним одержувачем. Замість запису програми CGI для кожної окремої форми, Ви можете заощадити час, написавши більше загальну програму CGI, яка підходить для всіх форм.

Торкнувшись усіх основних аспектів CGI, я забезпечив Вас достатніми відомостями, щоб розпочати програмування CGI. Однак, щоб стати ефективним розробником CGI, потрібно мати глибше розуміння того, як CGI зв'язується із сервером та браузером. У частині цієї книги, що залишилася, докладно розглядаються ті питання, про які мимохіть було згадано в цьому розділі, а також питання стратегії розробки додатків, переваги та обмеження протоколу.

Резюме

У цьому розділі коротко було описано основи програмування CGI. Ви створюєте висновок, правильно форматуючи ваші дані та друкуючи у stdout. Отримання введення CGI є більш складною справою, тому що він повинен бути проаналізований до свого використання. На щастя, вже існує кілька бібліотек, які здійснюють синтаксичний аналіз.

До даному моментуВи повинні легко впоратися з програмуванням програм CGI. Решта цієї книги присвячена докладнішому викладу специфікації, підказкам і стратегії програмування більш просунутих і складних додатків.