Афішування inurl c board cgi cmd. Технології Інтернет. Лабораторний практикум: CGI. Загальна стратегія програмування

Овочі 15.04.2022

Як правильно шукати за допомогою google.com

Всі напевно вміють користуватися такою пошуковою системою, як Google =) Але не всі знають, що якщо грамотно скласти пошуковий запит за допомогою спеціальних конструкцій, то можна досягти результатів того, що Ви шукаєте набагато ефективніше і швидше =) У цій статті я постараюся показати що та як Вам потрібно робити, щоб шукати правильно

Google підтримує кілька розширених операторів пошуку, які мають особливе значення при пошуку на google.com. Типово, ці оператори змінюють пошук, або навіть говорять гуглу робити абсолютно різні типи пошуку. Наприклад, конструкція link:є спеціальним оператором, та запит link:www.google.comне дасть вам нормального пошуку, але натомість знайде всі web-сторінки, які мають зв'язки до google.com.
альтернативні типи запитів

cache:Якщо Ви будете включати інші слова в запит, то Google підсвітить ці включені слова в межах документа, що кешується.
Наприклад, cache:www.сайт webпокаже вміст, що кешується, з підсвіченим словом "web".

link:Даний пошуковий запит покаже веб-сторінки, на яких містяться посилання до зазначеного запиту.
Наприклад: link:www.сайтвідобразить усі сторінки, на яких є посилання на http://www.сайт

related:Відобразить веб-сторінки, які є "подібними" (related) вказаній веб-сторінці.
Наприклад, related: www.google.comперерахує web-сторінки, які є подібними до домашньої сторінки Google.

info:Інформація запиту: представить небагато інформації, яку Google має про веб-сторінку, що запитується.
Наприклад, info:сайтпокаже інформацію про наш форум =) (Армада - Форум адалт вебмайстрів).

Інші інформаційні запити

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

stocks:Якщо Ви починаєте запит із stocks: Google обробить решту термінів запиту як символи біржових зведень, і зв'яжеться зі сторінкою, яка показує готову інформацію для цих символів.
Наприклад, stocks: Intel yahooпокаже інформацію про Intel та Yahoo. (Зазначте, що Ви повинні надрукувати символи останніх новин, не назва компанії)

Модифікатори запитів

site:Якщо ви включаєте site: у ваш запит, Google обмежить результати тими вебсайтами, які знайде в цьому домені.
Також можна шукати і по окремих зонах, як ru, org, com, etc ( site:com site:ru)

allintitle:Якщо ви запускаєте запит з allintitle:, Google обмежить результати з усіма словами запиту в заголовку.
Наприклад, allintitle: google searchповерне всі сторінки гугла з пошуку як images, Blog, etc

intitle:Якщо Ви включаєте intitle: у вашому запиті, Google обмежить результати документами, що містять слово в заголовку.
Наприклад, intitle:Бізнес

allinurl:Якщо ви запускаєте запит з allinurl: Google обмежить результати, з усіма словами запиту в URL.
Наприклад, allinurl: google searchповерне документи з google та search у заголовку. Також як варіант можна розділяти слова слешем (/) тоді слова по обидва боки слеша шукатимуться в межах однієї сторінки: Приклад allinurl: foo/bar

inurl:Якщо ви включаєте inurl: у вашому запиті, Google обмежить результати документами, що містять слово в URL.
Наприклад, Animation inurl:сайт

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

daterange:шукає у тимчасових рамках (daterange: 2452389-2452389), дати для часу вказуються у Юліанському форматі.

Ну і ще всякі цікаві приклади запитів

Приклади складання запитів для Google. Для спамерів

Inurl:control.guest?a=sign

Site:books.dreambook.com “Homepage URL” “Sign my” inurl:sign

Site:www.freegb.net Homepage

Inurl:sign.asp Character Count

“Message:” inurl:sign.cfm “Sender:”

Inurl:register.php “User Registration” “Website”

Inurl:edu/guestbook “Sign the Guestbook”

Inurl:post “Post Comment” “URL”

Inurl:/archives/ “Comments:” “Remember info?”

“Script and Guestbook Created by:” “URL:” “Comments:”

Inurl:?action=add “phpBook” “URL”

Intitle:"Submit New Story"

Журнали

Inurl:www.livejournal.com/users/ mode=reply

Inurl greatestjournal.com/mode=reply

Inurl:fastbb.ru/re.pl?

Inurl:fastbb.ru/re.pl? "Гостьова книга"

Блоги

Inurl:blogger.com/comment.g?"postID""anonymous"

Inurl:typepad.com/ “Post a comment” “Remember personal info?”

Inurl:greatestjournal.com/community/ “Post comment” “addresses of anonymous posters”

"Post comment" "addresses of anonymous posters" -

Intitle:"Post comment"

Inurl:pirillo.com “Post comment”

Форуми

Inurl:gate.html?”name=Forums” “mode=reply”

Inurl: "forum/posting.php?mode=reply"

Inurl: "mes.php?"

Inurl: "members.html"

Inurl:forum/memberlist.php?”

Завдяки Всесвітньому павутинню, майже будь-хто може дати інформацію в Інтернеті в приємному для очей і придатному для широкого поширення вигляді. Ви безперечно подорожували Інтернетом і бачили інші сайти, і тепер ймовірно знаєте, що лякаючі скорочення типу "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. Решта цієї книги присвячена докладнішому викладу специфікації, підказкам і стратегії програмування більш просунутих і складних додатків.

Для отримання достовірного результату аналіз повинен проводитися не менш як через 2 тижні після останнього прийому антибіотиків та (або) антибактеріальних препаратів.

  • Зішкріб з уретри рекомендується здавати через 2 години після останнього сечовипускання, зіва та носоглотки - натщесерце (через 4-5 годин після останнього прийому їжі, при цьому необхідно виключити чистку зубів та полоскання рота), для інших локусів спеціальної підготовки не потрібно.
  • Сеча. Дослідженню підлягає середня порція вільно випущеної сечі, у кількості 3-5 мл у стерильний пластиковий одноразовий контейнер (контейнер можна отримати в реєстратурі) після ретельного туалету зовнішніх статевих органів без застосування антисептиків. Термін доставки до лабораторії при кімнатній температурі – 1-2 години, при температурі 2-8°С – 5-6 годин.
  • Сперма для бактеріологічного дослідження збирається в стерильний пластиковий одноразовий контейнер із широким горлом шляхом мастурбації (контейнер можна отримати в реєстратурі). Термін доставки матеріалу до лабораторії при кімнатній температурі протягом 1-2 годин.
  • Мокроту рекомендується збирати з ранку, натще після санації ротової порожнини, в стерильну пластикову посуд. Термін доставки матеріалу до лабораторії при кімнатній температурі протягом 1-2 годин, при температурі 2-8°С – 5-6 годин.
  • Паркан секрету передміхурової залози здійснює лікар-уролог після попереднього масажу простати (дана маніпуляція виконується тільки в Центральному офісі). Перед забором секрету передміхурової залози рекомендується статева помірність протягом не менше 2-х днів.
  • Бактеріологічне дослідження грудного молока . Забір грудного молока проводиться тільки до годування дитини або через дві години після годування груддю. Обстежувана пацієнтка обмиває ліву і праву грудну залозу теплою водою з милом і витирає насухо чистим рушником. Поверхня сосків та кінчики пальців обробляє ваткою, помірно змоченою 70% етиловим спиртом. Перша порція грудного молока приблизно в кількості 0,5 мл, скидається. Потім, не торкаючись соска руками, жінка зціджує 0,5 - 1 мл молока з кожної залози окремий стерильний контейнер (контейнери можна отримати в реєстратурі). Термін доставки в лабораторію при кімнатній температурі – 1-2 години, при температурі 2-8°С – 5-6 годин.
  • Паркан з іновіальної рідини для бактеріологічного дослідження здійснюється лікарем у стерильному пластиковому посуді (контейнер можна отримати в реєстратурі). У разі лабораторії цю процедуру не виконується. Термін доставки матеріалу до лабораторії при кімнатній температурі протягом 1-2 годин, при температурі 2-8°С – 5-6 годин.
  • Паркан раневого відокремлюваного для бактеріологічного дослідження здійснюється лікарем, в одноразовий контейнер із середовищем Еймса (контейнер можна отримати у реєстратурі). Термін доставки матеріалу до лабораторії при кімнатній температурі протягом 6 годин, при температурі 2-8°С – до 2 діб.
  • Жовч для бактеріологічного дослідження збирається при зондуванні, окремо, за порціями А, В і С три стерильні пробірки, або під час операції за допомогою шприца в одну пробірку, дотримуючись правил асептики (в лабораторії ця процедура не виконується). Термін доставки матеріалу до лабораторії при кімнатній температурі протягом 1-2 годин, при температурі 2-8°С – 5-6 годин.

"Designed by: PHPLD Your Site" "Submit Article" "Powered by ArticleMS" "Submit Article" "Main Menu" "Latest Articles" "Designer: Astralinks Directory" "Submit Article" "Submit Articles" "Member Login" "Most Popular Articles" "Article RSS Feeds" "Fields marked with asterisk are required" joomla "Designer: Free PHPLD Templates" "Submit Article" "RSS Articles" "RSS comments" "Recent Articles" "Authorization" "Username:" "Password: " "Remember Me" "Register" "Lost your password?" "Startseite ? Weblogs ? Weblog von" "RSS Feeds" "Add us to favorites" "Для отримання особливих відомостей" "Зміни статей" "Regular links with reciprocal" Article inurl:"/access/unauthenticated" Forums "Template by DevHunters. com" "Add Article" "Proudly Powered WordPress and BuddyPress" "Designer: Free PHPLD Templates" "Add Article" "Ця проблема є для тестування, де ви є людським відвідувачем і збираєтеся автоматизувати spam submissions" "До validate the reciprocal link Подивіться на наступний HTML-код на сторінці на URL" "Add Article" "Random Press Releases" "Press Release Script" inurl:"/blogs/load/recent" "Article Of The Week" "Article Directory All Rights reserved. " "Designed by: PHPLD Your Site" "Submit Article" "Alexa Information" "Listing Details" "LISTING URL" "Site Statistics" "Add Article" "Designed by One Way Links" "Add Article" "Ви назавжди ви check out наш каталог статей від категорій до вашого лівого, і тому, щоб отримати цей сайт до ваших favorites!" "Designer: PHPLD Templates" "Add Article" "More information about text formats" "Rate Author: Current:" "Powered by: php Link Directory" "Add Article" "Unacceptable Sites, Content & few reasons why submissions are not approved: " "Add Article" "Template By Yazzoo" "Add Article" "Theme by: Romow Web Directory" "Submit Article" "Powered by WordPress + Article Directory plugin" "Theme By: Web Directory" "Submit Article" "RSS Articles" "RSS comments" "Recent Articles" "Powered by: php Link Directory" "Add Article" "%E8%AB%8B%E6%BA%96%E7%A2%BA%E5%A1%AB%E5%85% A5%E6%82%A8%E7%9A%84%E9%83%B5%E7%AE%B1%EF%BC%8C%E5%9C%A8%E5%BF%98%E8%A8%98% E5%AF%86%E7%A2%BC%EF%BC%8C%E6%88%96%E8%80%85%E6%82%A8%E4%BD%BF%E7%94%A8%E9% 83%B5%E4%BB%B6%E9%80%9A%E7%9F%A5%E5%8A%9F%E8%83%BD%E6%99%82%EF%BC%8C%E6%9C% 83%E7%99%BC%E9%80%81%E9%83%B5%E4%BB%B6%E5%88%B0%E8%A9%B2%E9%83%B5%E7%AE%B1% E3%80%82" "Using Article Directory plugin" "This link directory use session to store information" "Add Article" "Blog Menu" "Create Blog" " My Blogs" "PHPmotion" "PHPLD CLUB - FREE THEMES FOR YOU" "Add Article" "Skinned by: Web Design Directory" "Add Article" "Template By Yazzoo" "Add Article" "Template by DevHunters.com" "Add Article " "Якщо ви не збираєтеся отримувати коментар. Якщо Ви знайдете повідомлення, Ви можете отримати коментар" "Template By Free PHPLD Templates" "Add Article" "Sponsored By: Webmaster Tips & Tricks / Download FREE phpLD Themes" "Submit Article" "Theme By: Web Directory" "Add Article" "Використання електронної пошти в нашому центрі на веб-сторінці, що надсилає ваших відвідувачів" "Powered by: php Link Directory" "Submit Article" "Supported by Bid for Position" "Add Article" "Theme by: Romow Web Directory" "Submit Article" "Supported by Bid for Position" "Submit Article" "Supported by Bid for Position" "Add Article" "Sponsored By: Webmaster Tips & Tricks / Download FREE phpLD Themes" "Submit Article" "Designed by Mitre Design and SWOOP" "Submit Article" "Theme By: Web Directory" "Add Article" "Home Videos Audios" Blogs phpmotion "Template by DevHunters.com" "Submit Article" "Designed By: Invitation Web Directory" "Add Article" "registered authors in our article directory" "PHP Link Directory" "Add Article" "Sponsored By: Webmaster Tips & Tricks / Download FREE phpLD Themes " "Add Article" "Powered by Article Dashboard" "Anmelden oder Registrieren um Kommentare zu schreiben" "Startseite ? Weblogs" "Developed by Hutbazar" "Add Article" Home Members RSS "created the group" "Для створення аккаунту потрібно отримати." "Powered By: Article Friendly Ultimate" inurl:"/wp-login.php?action=register " "Designer: PHPLD Templates" "Submit Article" "powered by joomla" "add new post" "Designed by One Way Links" "Add Article" "До validate reciprocal link please include the following HTML code in the page at the URL " "Submit Article" "Sponsored by Directhoo" "Add Article" "Template by: Emillie Premium Directory" "Submit Article" "Сервіси * публіковані сторінки та * registered authors" inurl:"/node/1" "You are here" "Публікую ваш матеріал в RSS форматі для інших веб-сайтів для syndicate" "Template By Yazzoo" "Submit Article" "Powered by PHPLD" "Submit Article" "Articles with any spelling or grammar errors will be deleted" "DIRECTORY SCRIPT BY PHP LINK DIRECTORY " "Add Article" inurl:submitguide.php "submit articles" "Editors Picks" "Press Release Script" "Add Article" "PHP Link Directory" Home "Free Signup" "Submit Article" "About Us" "Contact Us" "Search Site" "Author Login" "Alexa Information" "Listing Details" "LISTING URL" "Site Statistics" "Add Article" "This link directory uses sessions to store information" "Add Article" "Designed by: PHPLD Your Site" "Add Article" "Submit Articles" "Якщо ви не маєте ні того, ти можеш його зареєструвати. " "designed by AskGraphics.com" "Submit Article" inurl:"/user/profile.php?id=" moodle "Most Rated Press Releases" "Press Release Script" "Do not submit articles filled with spelling errors and bad grammar" "Theme by: Romow Web Directory" "Add Article" "Use the Articles search box to locate articles on range of topics" "Sponsored by Directhoo" "Add Article" "PHP Link Directory" inurl:"submit_article.php" "This author has published * articles so far. Більше info про те, як автівка з'являється дзвінок." "Підключено з PHPLD" "Submit Article" "Powered by PHPmotion" - Free Video Script "Powered by: php Link Directory" "Submit Article" "Якби ви хотіли б це зробити? digest about new articles every day" "Expert Authors" "Article Directory All Rights reserved." "PHP Link Directory" "Add Article" "Skinned by: Web Design Directory" "Submit Article" Subject Homepage "Allow Comment" "Maximum Attachments" "Home | Blogs" "Login або Registry to post comments" "PHPLD CLUB - FREE THEMES FOR YOU" "Submit Article" "Submit Link" Pricing "Enter the code shown" "This helps prevent automated registrations." " Submit Article" "Зазначено для: Invitation Web Directory" "Submit Article" "Template by: Emillie Premium Directory" "Add Article" "Ця link directory використовується для покупки інформації" "Submit Article" "Виконати автоматичне spam submissions leave this field empty" Country "City/town" "Last access" "Ви не можете зареєструватися в" "Wordpress A rticle Directory Script" "PHP Link Dircetory" "Add Article" "Live Articles" "Article Directory Всі права захищені." " "Designed by One Way Links" "Submit Article" "Designed By: Invitation Web Directory" "Add Article" "Template by: Emillie Premium Directory" "Submit Article" "Наявність цієї філії є придбаним приватним і не буде вибрано publicly" "Зазначено: Futuristic Artists" "Add Article" "Designer: Astralinks Directory" "Submit Article" "Відмінні місця, вміст і кілька повідомлень, які не можуть бути використані:" "Add Article" "Hot Press Releases" "Press Release Script" "Натисни, я можу по електронній пошті електронною поштою" inurl:"populararticles.php" "Вибрані сторінки або зображення" "Підмітка Article" "PHP Link Directory" "Підмітка" "Підсумок або зареєструватися до post comments" "Search this site :" "Article Details" "Ви повинні бути підтверджені в rating" "You must be logged in the leave a Comment" "Wordpre ss Article Directory Script" "PHP Link Dircetory" "Submit Article" "Powered by vbulletin" "Recent Blogs Posts" "Submit Articles" inurl:"submitart.php" "Designed By: Invitation Web Directory" "Submit Article" "Submit Articles " "Total Articles" "Total Authors" "Total Downloads" "Designed by Mitre Design and SWOOP" "Add Article" "Designed by: Futuristic Artists" "Submit Article" "Якщо ви маєте докладніше component configures by double-clicking background, text , images, or quotations" "Press Release Categories" "Press Release Script" "Підсумок: PHPLD Your Site" "Add Article" "Sponsored by Directhoo" "Submit Article" "Author Terms of Service" "Publisher Terms of Service" " Disclaimer" "Ви маєте право на те, щоб включати оголошення на сторінки з вашими матеріалами" "підтримується phpmotion" " "Powered by ArticleMS from ArticleTrader.com" "Submitted by Anonymous" "Login або register to post comments" "Most Popular Articles" "Article Directory All Rights reserved. " "Skinned by Addictive Games" "Submit Article" "Terms of Use" "This is a demo page only ." "themes/default/templates/generic_terms.htm" "Submit Link" Pricing "Enter the code shown" "This helps prevent automated registrations." "Add Article" "Skinned by Addictive Games" "Submit Article" inurl:"login2submitart .php" "Те є * публіковані сторінки і * зареєстровані автори в нашому матеріалі." "Зміна цієї статті: Current:" Subject inurl:"act=dispBoardWrite" inurl:"login.php" "Зареєструватися " "Submit Link" Pricing "Enter code shown" "This helps prevent automated registrations." reciprocal link please include the following HTML code in the page at the URL" "Add Article" "Skinned by Addictive Games" "Add Article" "Більше відомості про формування опцій" "Designed by One Way Links" "Submit Article" "Alexa Information " "Listing Details" "LISTING URL" "Site Statistics" "Submit Article" "designed by AskGra phics.com" "Add Article" "Підвищуючи інформацію про пакетні ліки, ви не можете прочитати" inurl:"submitarticles.php" "Powered by Press Release Script" "Sign-Up" "Please fill out this form, and we" ll send you a welcome електронною поштою до verify вашої електронної пошти і log you in." Forums "Розмір: PHPLD Templates" "Add Article" inurl:"/blog/index.php?postid=" moodle "Developed by Hutbazar" "Submit Article" "Designer: Astralinks Directory" "Add Article" "Publish your article in RSS формат для інших веб-сайтів для syndicate" Home "Submit Article" "Latest Links" "Top Hits" "Template by DevHunters.com" "Submit Article" link:"www.articledashboard.com" "Login to Your Account" "Login to access your author control panel" "Ви маєте аккаунт?" "Your one-stop source for free articles. До вас потрібні contents для того, щоб зробити ваш сайт?" "Powered by PHPLD" "Add Article" "Lines and paragraphs break automatically" "Recently Approved Articles" "Article Directory All Rights reserved." "Template by: PHPmotionTemplates.com" " Smart Blog" "Add new post" "PHP Link Directory" inurl:"submit_article.php" "DIRECTORY SCRIPT BY PHP LINK DIRECTORY" "Add Article" "Supported by Bid for Position" "Submit Article" "PHP Link Directory" "Submit Article" "DIRECTORY SCRIPT BY PHP LINK DIRECTORY" "Submit Article" "Developed by Hutbazar" "Submit Article" "Відповідний на: Webmaster Tips & Tricks / Download FREE phpLD Themes" "Add Article" "Hot Articles" "Article Directory All Rights reserved." "Підтримано безкоштовно з PHPmotion" Blogs "Якщо я не маю нових повідомлень поставлений" "До validate reciprocal link please include the following HTML code in the page at the URL" "Submit Article" "There are now * Excellent Articles in our Database from * Authors" "Ця link directory використовується для сфери інформації" "Submit Article" "завантажити наші сторінки і keep updated o new articles. " Home "Add Article" "Latest Links" "Top Hits" "Unacceptable Sites, Content & few reasons why submission are not approved:" "Submit Article" "Copyright * vBulletin Solutions" "Create Blog" "Template By Free PHPLD Templates" "Add Article" "Press Release Of The Week" "Press Release Script" "Template By Free PHPLD Templates" "Submit Article" "завантажити наші статі та keep updated o new articles." "PHPLD CLUB - FREE THEMES FOR YOU" "Add Article" "Post Article Comments" "Article Directory All Rights reserved." "Create new account Log in Request new password" "Use the articles in our directory on your website to provide your visitors" "DIRECTORY SCRIPT BY PHP LINK DIRECTORY" "Submit Article" "Powered by WordPress ž Using Article Directory plugin" "Skinned by Addictive Games" "Add Article" "Recently Approved" "Press Release Script" "Editors Picks" "Article Directory All Rights reserved." "Alexa Information" "Listing Details " "LISTING URL" "Site Statistics" "Submit Article" "Template by: Emillie Premium Directory" "Add Article" "Support Software by Zendesk" Forums" (Login)" Country "City/Town" "Web page" "Random Articles" "Article Directory All Rights reserved." "Designed by Mitre Design and SWOOP" "Add Article" "Developed by Hutbazar" "Add Article" "Contact Us " "Це є демо-сторінка тільки." "themes/default/templates/generic_contactus.htm" "Недосяжна стаття, контент і кілька повідомлень, які підписи не підтримуються:" "Submit Article" "Public Group" "Popular Search Terms" " Recent Search Terms" "Powered by UCenter Home" "Designer: PHPLD Templates" "Submit Article" "Welcome!" "Article Submission"" "Add Article" "Template By Free PHPLD Templates" "Submit Article" "Theme By: Web Directory" "Submit Article" "Якщо ви збираєтеся отримувати приємність, ти думаєш, що ви маєте" "designed by AskGraphics.com" "Submit Article" "Designer: Astralinks Directory" "Add Article" "Designed by: Futuristic Artists" "Submit Article" "Expert Authors" "Press Release Script" "About the Auth or" "Recent posts" "Add New Comment" "Website Design and Developed by ArticleBeach" "Skinned by: Web Design Directory" "Submit Article" "Provide a password for New account in both fields" "Designed by Mitre Design and SWOOP " "Підмітка Article" "Here are the most popular 100 articles on" "Article Script - Powered By Article Marketing" "Submit Articles" "Завантажити повідомлення для отримання коментарів" "Add New Post" "Login to Post New content in the forum. " "Powered by Drupal" "support software" inurl:"/entries/" "Wordpress Article Directory Script" "PHP Link Dircetory" "Submit Article" "Add Article" "PHP Link Directory" "Submit Link" Pricing "Enter the code shown" "This helps prevent automated registrations." "Add Article" "PHP Link Directory" "Submit Article" "Create your own personal address with your friends and family can find you!" "Most ." "Skinned by: Web Design Directory" "Add Article" "Regular links with reciprocal" Article "Template By Yazzoo" "Submit Article" "Submit Article" "PHP Link Directory" "Theme by: Romow Web Directory" "Add Article " "PHPLD CLUB - FREE THEMES FOR YOU" "Submit Article" Home "Submit Article" "Latest Links" "Top Hits" "Welcome to article directory *. Тут можна дізнатися про цікаві і корисні відомості про найбільш популярні теми." "Завжди" "Це є демо сторінка тільки." "themes/default/templates/generic_aboutus.htm" "Newest Authors" "Welcome to our new authors!" "Як ти можеш бути можливим" "Якщо ви будете робити?" Article Directory Script" "PHP Link Dircetory" "Add Article" "Additional Articles From" "Використані anonymous (not verified)" "designed by AskGraphics.com" "Add Article" "Надіслати електронною поштою до нашого керуючого panel" "Signup now до submit your own articles" "Ця проблема є для того, щоб тестувати, чи не є вашим відвідувачем, і дотримуватися автоматизованих spam submissions" inurl:"/node/2" "Ви можете" "Advertise With Us" "This is a demo page only." "themes/default/templates/generic_advertise.htm" "Sponsored by Directhoo" "Submit Article" link:www.articletrader.com "Powered by vBulletin" "Create Blog" "Powered by PHPLD" "Add Article" inurl:"/node/3" "You are here" "Design and Developed by ArticleBeach" "Powered by Article Dashboard" inurl:submitarticles.php inurlopulararticles.php "Powered By: Article Friendly" inurl: submitguide.php "submit articles" "Powered by ArticleMS" "Using Article Directory plugin" "Join now to promote your business, find partners, build relationships and reconnect with community. Sync with Facebook Twitter Електронна пошта SMS та більше" "є мікро-blogging service, що базується на Free Software Laconica tool." "External Profiles" "Last online" "About Me" "Public notes" you doing" "groups" "Most popular" "All Groups" "Forgot your password? " "Powered By" "revou" "Join now to promote your business, find partners, build relationships and reconnect with community. Sync with Facebook Twitter Ваша електронна пошта SMS і більше" "Залишається, коли клацніть в?" "It runs the StatusNet microblogging software" "is micro-blogging service based on the Free Software StatusNet tool." "join the conversation" "image code" "register below." less." "Це безкоштовне flowing dialogue lets you send messages, pictures and video to anyone" "Sign up with your email address. Там існують * зареєстровані члени." "Ми текст і файли доступні під Creative Commons Attribution 3.0 except this private data: password, email address, IM address, and phone number." groups "Most popular" "All Groups" "Forgot your password?" "Powered By" "ReVou Software" "Ви можете скористатися моїми повідомленнями, щоб скористатися всіма користувачами, не тільки для моїх людей" "Powered by Sharetronix" "Powered by Jisko" "Якщо ви можете створити новий обліковий запис. Ви можете отримати повідомлення і звернутися до друзів і товаришів." "У цьому форматі ви можете створити новий рахунок. Ви можете повідомити про це і скористатися друзями і друзями." "Ми текст і файли можуть бути встановлені під Creative Commons Attribution 3.0 except this private data: password, email address, IM address, and phone number." "Your Name (without space between letters and words)" "Powered by Blogtronix" "powered by twitter script" "Copyright * Twitter Script" "It runs the Laconica microblogging software" "Powered by * Script" inurl:"/recentupdates.php" "Powered by Scritter Script " "Attached Image: " "Powered by Blogtronix" "Public notes" "Terms of Service" "Normal version" "Це також є додатковим і з'єднаним з іншими людьми для приватних подробиць і для клопоту з їх оновленнями." Public notes" "Normal version" "Login" "Powered By ReVou Software" inurl:"Special:UserLogin" wiki inurl:":UserLogin" "Theme: Feb12" "first" "prev" "1-20 of" "next" "inurl:groups inurl:"http://wiki." " inurl:"Utilizador:" wiki inurl:"title=User:" wiki "Deze pagina is het laatst bewerkt op" "Deze pagina is" "Aanmelden / registroren" "MoinMoin Powered" "GPL licensed" inurl:"title=% D0%9E%D0%B1%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%BD%D1%8F_%D0%BA%D0% BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87%D0%B0:" "DokuWiki supports some simple markup language" "What s Hot" "Recent Changes" "Upcoming Events" "Tags" inurl:"title=Diskuse_s_u%C5%BEivatelem:" "Mac OS X Server - Wikis" inurl:"title=%E0%A6%AC%E0%A7% 8D%E0%A6%AF%E0%A6%AC%E0%A6%B9%E0%A6%BE%E0%A6%B0%E0%A6%95%E0%A6%BE%E0%A6%B0% E0%A7%80_%E0%A6%86%E0%A6%B2%E0%A6%BE%E0%A6%AA:" inurl:"tiki-forums.php" inurl:"User_talk:" wiki "You will ще більше використовуваних сторінок у Wiki категоріях або в PageIndex" inurl:"title=Kasutaja_arutelu:" %E4%BC%9A%E8%A9%B1:" inurl:"Spezial:Anmelden" wiki "Thčme: Strasa - Mono" inurl:"title=Diskuse_s_wikistou:" "Collaborate with online document creation, editi ng, and comments. " "Log in to my page" "wikis" inurl:/wiki/dokuwiki inurl:"wiki/RecentlyCommented" inurl:"http://mediawiki." A8%E8%80%85%E3%83%BB%E3%83%88%E3%83%BC%E3%82%AF:" inurl:"%ED%8A%B9%EC%88%98%EA %B8%B0%EB%8A%A5:%EB%A1%9C%EA%B7%B8%EC%9D%B8" wiki inurl:"title=%D7%A9%D7%99%D7%97%D7 %AA_%D7%9E%D7%A9%D7%AA%D7%9E%D7%A9:" "Theme: Eatlon" "Те, що немає коментарів на цій сторінці." "Your hostname is" "Valid XHTML" "Valid CSS" inurl:"title=%D8%A8%D8%AD%D8%AB_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1:" inurl:"title=Usuario:" inurl :"/wikka.php?wakka=UserSettings" "what links here" "related changes" "Special pages" inurl:"title=%E0%B8%84%E0%B8%B8%E0%B8%A2%E0% B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9C%E0%B8%B9%E0%B9%89%E0%B9%83%E0%B8%8A%E0%B9% 89:" intitle:"Mac OS X Server" "Powered by TikiWiki CMS/Groupware v2" "Ця сторінка була ухвалена" "Ця сторінка була доступна" "Log in / create account" "Immutable Page" Info Attachments "There is currently no text in this page, ви можете знайти для цієї page title i n інших сторінок або редагувати цю сторінку." "Driven by DokuWiki" "Завжди налаштовувати TikiWiki!" inurl:"Utilisateur:" wiki inurl:groups "log in to my page" "updates" "wikis" "blogs" "calendar" "mail" "Theme: Ohia" "Powered by TikiWiki" FrontPage RecentChanges title=Th%E1%BA%A3o_lu%E1%BA%ADn_Th%C3%A0nh_vi%C3%Aan:" inurl:"title=Szerkeszt%C5%91vita:" inurl:"/wikka/UserSettings" "What " "Recent Changes" "Upcoming Events" inurl:"%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C4%83ng_nh%E1%BA%ADp" wiki inurl:"%D0 %A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:" wiki inurl:"title=Pembicaraan_Pengguna:" inurl:"wiki/index.php? title="(!LANG: wiki inurl:"title=%E0%A4%B8%E0%A4%A6%E0%A4%B8%E0%A5%8D%E0%A4%AF_%E0%A4%B5%E0%A4%BE%E0%A4%B0%E0%A5%8D%E0%A4%A4%E0%A4%BE:" inurl:"title=Benutzer_Diskussion:" "Theme: Fivealive" inurl:"title=Diskusia_s_redaktorom:" "What’s Hot" "Recent Changes" "Upcoming Events" "Tags" "Edited" inurl:"tiki-index.php" inurl:"title=%D0%A0%D0%B0%D0%B7%D0%B3%D0%BE%D0%B2%D0%BE%D1%80_%D1%81%D0%B0_%D0%BA%D0%BE%D1%80%D0%B8%D1%81%D0%BD%D0%B8%D0%BA%D0%BE%D0%BC:" inurl:"title=Bruger_diskussion:" inurl:"Especial:Registre_i_entrada" wiki inurl:"title=Usuari_Discussi%C3%B3:" inurl:"title=Overleg_gebruiker:" inurl:"title=%CE%A3%CF%85%CE%B6%CE%AE%CF%84%CE%B7%CF%83%CE%B7_%CF%87%CF%81%CE%AE%CF%83%CF%84%CE%B7:" "Make sure to whitelist this domain to prevent registration emails being canned by your spam filter!" inurl:"Especial:Userlogin" wiki inurl:"%E4%BD%BF%E7%94%A8%E8%80%85:" wiki inurl:"title=Usuario_discusi%C3%B3n:" inurl:"title=Brugerdiskussion:" "Theme: Jqui" inurl:"title=Brukerdiskusjon:" "wiki is licensed under" "What’s Hot" "Recent Changes" inurl:"tiki-login.php" inurl:"Special:Inloggning" wiki "MoinMoin Powered" inurl:"Speci%C3%A1ln%C3%AD:P%C5%99ihl%C3%A1sit" wiki inurl:"Speci%C3%A1lis:Bel%C3%A9p%C3%A9s" wiki inurl:"title=Anv%C3%A4ndardiskussion:" inurl:"Special:Whatlinkshere" "pageindex" "recentchanges" "recentlycommented" inurl:"/RecentlyCommented" site:.edu "forums register" site:.edu "register iam over 13 years of age forum" site:.edu "discussion board register" site:.edu "bulletin board register" site:.edu "message board register" site:.edu "phpbb register forum" site:.edu "punbb register forum" site:.edu "forum signup" site:.edu "vbulletin forum signup" site:.edu "SMF register forum" site:.edu "register forum Please Enter Your Date of Birth" site:.edu "forums - Registration Agreement" site:.edu "forum Whilst we attempt to edit or remove any messages containing inappropriate, sexually orientated, abusive, hateful, slanderous" site:.edu "forum By continuing with the sign up process you agree to the above rules and any others that the Administrator specifies." site:.edu "forum In order to proceed, you must agree with the following rules:" site:.edu "forum register I have read, and agree to abide by the" site:.edu "forum To continue with the registration procedure please tell us when you were born." site:.edu "forum I am at least 13 years old." site:.edu "Forum Posted: Tue May 05, 2009 8:24 am Memberlist Profile" site:.edu "View previous topic:: View next topic forums" site:.edu "You cannot post new topics in this forum" site:.edu "proudly powered by bbPress" site:.edu "bb-login.php" site:.edu "bbpress topic.php" site:.edu "Powered by PunBB viewforum.php" site:.edu "Powered by PunBB register.php" site:.edu "The Following User Says Thank You to for this post" site:.edu "BB code is On" site:.edu "Similar Threads All times are GMT +1? site:.edu "If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post" site:.edu "Hot thread with no new posts" site:.edu "Thread is closed" site:.edu "There are 135 users currently browsing forums." site:.edu "forums post thread" site:.edu "forums new topic" site:.edu "forums view thread" site:.edu "forums new replies" site:.edu "forum post thread" site:.edu "forum new topic" site:.edu "forum view thread" site:.edu "forum new replies" site:.edu "add topic" site:.edu "new topic" site:.edu "phpbb" site:.edu "view topic forum" site:.edu "add message" site:.edu "send message" site:.edu "post new topic" site:.edu "new thread forum" site:.edu "send thread forum" site:.edu "VBulletin forum" site:.edu "Quick Reply Quote message in reply?" site:.edu "Currently Active Users: 232 (0 members and 232 guests)" site:.edu "Currently Active Users: members and guests" site:.edu "Forums Posting Statistics Newest Member" site:.edu "Users active in past 30 minutes: SMF" site:.edu "Users active in past 30 minutes: Most Online Today Most Online Ever" site:.edu "Most Online Today Most Online Ever Forums" site:.edu "Currently Active Users: 18 (0 members and 18 guests)" site:.edu "Users active today: 15478 (158 members and 15320 guests)" site:.edu "Threads: 673, Posts: 7,321, Total Members: 376? site:.edu "Add this forum to your Favorites List! Threads in Forum:" site:.edu "Threads in Forum Hot thread with no new posts" site:.edu "powered by vbulletin" site:.edu "powered by yabb" site:.edu "powered by ip.board" site:.edu "powered by phpbb" site:.edu "powered by phpbb3? site:.edu "powered by invision power board" site:.edu "powered by e-blah forum software" site:.edu "powered by xmb" site:.edu "powered by: fudforum" site:.edu "powered by fluxbb" site:.edu "powered by forum software minibb" site:.edu "this forum is powered by phorum" site:.edu "powered by punbb" site:.edu "powered by quicksilver forums" site:.edu "powered by seo-board" site:.edu "powered by smf" site:.edu "powered by ubb.threads" site:.edu "powered by the unclassified newsboard" site:.edu "powered by usebb forum software" site:.edu "powered by xennobb" site:.edu "powered by yaf" site:.edu "Powered By MyBB" site:.edu "Powered by IP.Board" site:.edu "powered by phpbb" site:.edu "forums post thread" site:.edu "forums new topic" site:.edu "forums view thread" site:.edu "forums new replies" site:.edu "forum post thread" site:.edu "forum new topic" site:.edu "forum view thread" site:.edu "forum new replies" site:.edu "forum" site:.edu "phorum" site:.edu "add topic" site:.edu "new topic" site:.edu "phpbb" site:.edu "yabb" site:.edu "ipb" site:.edu "posting" site:.edu "add message" site:.edu "send message" site:.edu "post new topic" site:.edu "new thread" site:.edu "send thread" site:.edu "vbulletin" site:.edu "bbs" site:.edu "intext:powered by vbulletin" site:.edu "intext:powered by yabb" site:.edu "intext:powered by ip.board" site:.edu "intext:powered by phpbb" site:.edu "inanchor:vbulletin" site:.edu "inanchor:yabb" site:.edu "inanchor:ip.board" site:.edu "inanchor:phpbb" site:.edu "/board" site:.edu "/board/" site:.edu "/foren/" site:.edu "/forum/" site:.edu "/forum/?fnr=" site:.edu "/forums/" site:.edu "/sutra" site:.edu "act=reg" site:.edu "act=sf" site:.edu "act=st" site:.edu "bbs/ezboard.cgi" site:.edu "bbs1/ezboard.cgi" site:.edu "board" site:.edu "board-4you.de" site:.edu "board/ezboard.cgi" site:.edu "boardbook.de" site:.edu "bulletin" site:.edu "cgi-bin/ezboard.cgi" site:.edu "invision" site:.edu "kostenlose-foren.org" site:.edu "kostenloses-forum.com" site:.edu "list.php" site:.edu "lofiversion" site:.edu "modules.php" site:.edu "newbb" site:.edu "newbbs/ezboard.cgi" site:.edu "onlyfree.de/cgi-bin/forum/" site:.edu "phpbbx.de" site:.edu "plusboard.de" site:.edu "post.php" site:.edu "profile.php" site:.edu "showthread.php" site:.edu "siteboard.de" site:.edu "thread" site:.edu "topic" site:.edu "ubb" site:.edu "ultimatebb" site:.edu "unboard.de" site:.edu "webmart.de/f.cfm?id=" site:.edu "xtremeservers.at/board/" site:.edu "yooco.de" site:.edu "forum" site:.edu "phorum" site:.edu "add topic" site:.edu "new topic" site:.edu "phpbb" site:.edu "yabb" site:.edu "ipb" site:.edu "posting" site:.edu "add message" site:.edu "send message" site:.edu "post new topic" site:.edu "new thread" site:.edu "send thread" site:.edu "vbulletin" site:.edu "bbs" site:.edu "cgi-bin/forum/" site:.edu "/cgi-bin/forum/blah.pl" site:.edu "powered by e-blah forum software" site:.edu "powered by xmb" site:.edu "/forumdisplay.php?" site:.edu "/misc.php?action=" site:.edu "member.php?action=" site:.edu "powered by: fudforum" site:.edu "index.php?t=usrinfo" site:.edu "/index.php?t=thread" site:.edu "/index.php?t=" site:.edu "index.php?t=post&frm_id=" site:.edu "powered by fluxbb" site:.edu "/profile.php?id=" site:.edu "viewforum.php?id" site:.edu "login.php" site:.edu "register.php" site:.edu "profile.forum?" site:.edu "posting.forum&mode=newtopic" site:.edu "post.forum?mode=reply" site:.edu "powered by icebb" site:.edu "index.php?s=" site:.edu "act=login&func=register" site:.edu "act=post&forum=19? site:.edu "forums/show/" site:.edu "module=posts&action=insert&forum_id" site:.edu "posts/list" site:.edu "/user/profile/" site:.edu "/posts/reply/" site:.edu "new_topic.jbb?" site:.edu "powered by javabb 0.99? site:.edu "login.jbb" site:.edu "new_member.jbb" site:.edu "reply.jbb" site:.edu "/cgi-bin/forum/" site:.edu "cgi-bin/forum.cgi" site:.edu "/registermember" site:.edu "listforums?" site:.edu "forum mesdiscussions.net" site:.edu "version" site:.edu "index.php?action=vtopic" site:.edu "powered by forum software minibb" site:.edu "index.php?action=registernew" site:.edu "member.php?action=register" site:.edu "forumdisplay.php" site:.edu "newthread.php?" site:.edu "newreply.php?" site:.edu "/phorum/" site:.edu "phorum/list.php" site:.edu "this forum is powered by phorum" site:.edu "phorum/posting.php" site:.edu "phorum/register.php" site:.edu "phpbb/viewforum.php?" site:.edu "/phpbb/" site:.edu "phpbb/profile.php?mode=register" site:.edu "phpbb/posting.php?mode=newtopic" site:.edu "phpbb/posting.php?mode=reply" site:.edu "/phpbb3/" site:.edu "phpbb3/ucp.php?mode=register" site:.edu "phpbb3/posting.php?mode=post" site:.edu "phpbb3/posting.php?mode=reply" site:.edu "/punbb/" site:.edu "punbb/register.php" site:.edu "powered by phpbb" site:.edu "powered by punbb" site:.edu "/quicksilver/" site:.edu "powered by quicksilver forums" site:.edu "index.php?a=forum" site:.edu "index.php?a=register" site:.edu "index.php?a=post&s=topic" site:.edu "/seoboard/" site:.edu "powered by seo-board" site:.edu "seoboard/index.php?a=vforum" site:.edu "index.php?a=vtopic" site:.edu "/index.php?a=register" site:.edu "powered by smf 1.1.5? site:.edu "index.php?action=register" site:.edu "/index.php?board" site:.edu "powered by ubb.threads" site:.edu "ubb=postlist" site:.edu "ubb=newpost&board=1? site:.edu "ultrabb" site:.edu "view_forum.php?id" site:.edu "new_topic.php?" site:.edu "login.php?register=1? site:.edu "powered by vbulletin" site:.edu "vbulletin/register.php" site:.edu "/forumdisplay.php?f=" site:.edu "newreply.php?do=newreply" site:.edu "newthread.php?do=newthread" site:.edu "powered by bbpress" site:.edu "bbpress/topic.php?id" site:.edu "bbpress/register.php" site:.edu "powered by the unclassified newsboard" site:.edu "forum.php?req" site:.edu "forum.php?req=register" site:.edu "/unb/" site:.edu "powered by usebb forum software" site:.edu "/usebb/" site:.edu "topic.php?id" site:.edu "panel.php?act=register" site:.edu "a product of lussumo" site:.edu "comments.php?discussionid=" site:.edu "/viscacha/" site:.edu "forum.php?s=" site:.edu "powered by viscacha" site:.edu "/viscacha/register.php" site:.edu "/post?id=" site:.edu "post/printadd?forum" site:.edu "community/index.php" site:.edu "community/forum.php?" site:.edu "community/register.php" site:.edu "powered by xennobb" site:.edu "hosted for free by zetaboards" site:.edu "powered by yaf" site:.edu "yaf_rules.aspx" site:.edu "yaf_topics" site:.edu "postmessage.aspx" site:.edu "register.aspx" site:.edu "post/?type" site:.edu "action=display&thread" site:.edu "index.php" site:.edu "index.php?fid" site:.edu inurl:guestbook inurl: edu guestbook inurl:edu Link:http://worldwidemart.com/scripts/ inurl:"guestBook.aspx" site:edu inurl:guest inurl:guest site:edu inurl:guestbook.html inurl:guestbook.php inurl:kg.php inurl:guestbook.html site:.edu inurl:guestbook.php site:.edu inurl:?agbook=addentry inurl:?show=guestbook&do=add inurl:?t=add inurl:GuestBook/addentry.php inurl:Myguestbook/index.asp inurl:addentry.html inurl:addentry.php inurl:addguest.cgi inurl:addguest.htm inurl:addguest.html inurl:addguest.php inurl:addguest.shtml inurl:apeboard.cgi inurl:apeboard_plus.cgi inurl:apeboard_plus.cgi?command= inurl:ardguest.php?do= inurl:aska.cgi inurl:aspboardpost.asp?id= inurl:bbs.cgi inurl:bbs.cgibbs.cgi? inurl:bbs.cgibbs.cgi?id= inurl:bbs.cgibbs.cgi?mode= inurl:bbs.cgibbs.cgi?page= inurl:bbs.cgibbs.cgi?room= inurl:bbs.cgibbs.php inurl:bbs.cgibbs/mm.php inurl:bbs.cgibbs_inaka.jsp inurl:board.cgi?id= inurl:board.cgi?mode= inurl:book.php inurl:c-board.cgi?cmd= inurl:cbbs.cgi inurl:cbbs.cgi?mode= inurl:cbbs.cgi?mode=new inurl:cf.cgi?mode= inurl:cgi-bin/config.pl inurl:cgi-bin/gbook.cgi inurl:cgi/gbook.cgi inurl:clever.cgi inurl:clever.cgi?mode= inurl:clever.cgi?page= inurl:clip.cgi inurl:combbs.cgi?mode= inurl:comment.htm inurl:comment.php inurl:comment.php?id= inurl:comment_reply.php?com_itemid= inurl:commentaire.php?id= inurl:comments.asp inurl:comments.htm inurl:comments.html inurl:comments.php inurl:comments.php?id= inurl:crazyguestbook.cgi?db= inurl:custombbs.cgi inurl:custreg.asp?action= inurl:cutebbs.cgi inurl:dcguest.cgi?action=add_form inurl:default.asp inurl:default.asp?action= inurl:diary.cgi?mode= inurl:e-guest_sign.pl inurl:e_sign.asp inurl:easyguestbookentry inurl:eguestbook.cgi?Sign inurl:eintrag.htm inurl:eintrag.html inurl:eintrag.php inurl:eintrag.php?id= inurl:eintrag1.php inurl:eintrag_neu.php inurl:eintragen.asp inurl:eintragen.htm inurl:eintragen.html inurl:eintragen.php inurl:eintragen.php?menuid= inurl:eintragen.pl inurl:emfsend.cgi?sc= inurl:entry.php inurl:entry.php?id= inurl:epad.cgi inurl:fantasy.cgi inurl:firebook.cgi inurl:form.php inurl:forum_posts.asp inurl:forum_topics.asp inurl:fpg.cgi inurl:fsguest.html inurl:fsguestbook.html inurl:g_book.cgi inurl:gaeste.php? inurl:gaestebuch.cgi inurl:gaestebuch.htm inurl:gaestebuch.html inurl:gaestebuch.php inurl:gaestebuch.php?action= inurl:gaestebuch.php?action=entry inurl:gaestebuch/ inurl:gaestebuch_lesen.php inurl:gastbok.php inurl:gastbuch.php inurl:gastenboek.html inurl:gastenboek.php inurl:gb.asp inurl:gb.cfm?bookID= inurl:gb.cgi?id= inurl:gb.php inurl:gb.php?action= inurl:gb.php?id= inurl:gb.php?tmpl= inurl:gb.php?user= inurl:gb/ inurl:gb/addrec.php inurl:gb_list.asp inurl:gb_sign.asp inurl:gbadd.php inurl:gbadd.php?action=new&interval=1 inurl:gbaddentry.php inurl:gbook.asp inurl:gbook.html inurl:gbook.php inurl:gbook.php?a= inurl:gbook.php?action= inurl:gbook.php?id= inurl:gbook.php?page=1 inurl:gbook.php?show= inurl:gbook/?page=1 inurl:gbook/gbook.php inurl:gbook2.php inurl:gbook?sign= inurl:gbooksign.asp inurl:gbserver inurl:gbuch.php inurl:gjestebok.php inurl:gjestebok/index.asp inurl:gjestebok/index.pl inurl:gjestebok3.asp inurl:gjesteboken.asp inurl:glight.cgi inurl:goto.php?msgadd inurl:gst_sign.dbm inurl:gstbk_add.php?sid= inurl:guest.asp inurl:guest.cfm inurl:guest.cgi inurl:guest.cgi?action=add_form inurl:guest.cgi?handle= inurl:guest.cgi?pageid= inurl:guest.cgi?site= inurl:guest.htm inurl:guest.html inurl:guest.php inurl:guest.pl inurl:guest/gbook.php inurl:guest_book.htm inurl:guest_book.html inurl:guestadd.html inurl:guestbook inurl:guestbook-add.html inurl:guestbook.asp inurl:guestbook.asp?action= inurl:guestbook.asp?mode= inurl:guestbook.asp?sent= inurl:guestbook.aspx inurl:guestbook.cfm inurl:guestbook.cgi inurl:guestbook.cgi?action= inurl:guestbook.cgi?action=add&aspm1= inurl:guestbook.cgi?id= inurl:guestbook.cgi?start= inurl:guestbook.htm inurl:guestbook.html inurl:guestbook.html?page= inurl:guestbook.mv?parm_func= inurl:guestbook.php inurl:guestbook.php.cgi?gbook= inurl:guestbook.php? inurl:guestbook.php?act= inurl:guestbook.php?action= inurl:guestbook.php?action=add inurl:guestbook.php?cmd= inurl:guestbook.php?do= inurl:guestbook.php?form= inurl:guestbook.php?id= inurl:guestbook.php?inputmask= inurl:guestbook.php?lang= inurl:guestbook.php?mode= inurl:guestbook.php?new_message= inurl:guestbook.php?new_message=1 inurl:guestbook.php?page= inurl:guestbook.php?pg= inurl:guestbook.php?sn= inurl:guestbook.pl inurl:guestbook.pl?action= inurl:guestbook.pl?action=add inurl:guestbook.pl?action=form inurl:guestbook/add.html inurl:guestbook/comment.php?gb_id= inurl:guestbook/index.asp inurl:guestbook/php/entry.php inurl:guestbook/post/ inurl:guestbook2.asp?l= inurl:guestbook_add.php inurl:guestbook_new.php inurl:guestbook_sign.php inurl:guestbook_sign.php?oscsid= inurl:guestbookadd.asp inurl:guestbookvip.php inurl:guestbookvip.php?memid= inurl:guestbox.php?anfangsposition= inurl:guestform.php inurl:guestform.php?gbid=cdg inurl:guestsaisie.php inurl:honey.cgi inurl:honey.cgi?mode= inurl:ibbs.cgi inurl:ibbs.cgi?H=tp&no=0 inurl:ibbs.cgi?page= inurl:imgboard.cgi inurl:index.php3?add=1 inurl:index.php?gbname= inurl:index.php?id=...&item_id= inurl:index.php?p=guestbook!}<=NL&action=add inurl:index.php?page=guestbook_read inurl:joyful. inurl:joyful.cgi inurl:joyfulyy.cgi inurl:jsguest.cgi?action=new inurl:kakikomitai.cgi? inurl:kb_pc.cgi inurl:kboard.cgi inurl:kbpost.htm inurl:kerobbs.cgi inurl:kerobbs.cgi?page= inurl:kiboujoken.htm inurl:kniha.php inurl:krbbs.cgi inurl:ksgosci.php inurl:ksiega.php inurl:ktaiufo.cgi inurl:light.cgi inurl:light.cgi?page= inurl:mboard.php inurl:messageboard.html inurl:messages.php?1=1&agbook=addentry inurl:mezase.cgi inurl:minibbs.cgi inurl:minibbs.cgi?log= inurl:mkakikomitai.cgi inurl:msboard.cgi?id= inurl:msgboard.mv?parm_func= inurl:msgbook.cgi?id= inurl:new.php?forum_id= inurl:new_message.asp inurl:newdefault.asp inurl:newdefault.asp?DeptID= inurl:news.php?subaction= inurl:patio.cgi inurl:petit.cgi inurl:phello.cgi inurl:post.asp inurl:post.htm inurl:post.html inurl:post_comment.php?u= inurl:post_comment.php?w= inurl:postcards.php?image_id= inurl:print_sec_img.php inurl:purybbs.cgi inurl:purybbs.cgi?page= inurl:rabook.php inurl:rbook.cgi inurl:rbook.cgi?page= inurl:read.cgi/gboy/ inurl:read.cgi?board= inurl:reg.php?pid= inurl:resbbs.cgi inurl:schedule.cgi?form= inurl:sendmessage.asp inurl:showguestbook.php?linkid= inurl:sicharou.cgi inurl:sign.asp inurl:sign.asp?PagePosition= inurl:sign.html inurl:sign.php inurl:sign_guestbook.asp inurl:sign_guestbook_form.asp inurl:signbook.cfm inurl:signerbok.asp inurl:signgb.php inurl:signguestbook.asp inurl:signguestbook.html inurl:signguestbook.php inurl:signup.php inurl:simbbs.cgi inurl:skriv.html inurl:skriv_i_gaestebogen.html inurl:spguest.cgi?id= inurl:stlfbbs.cgi inurl:submit.asp inurl:submit.html inurl:submit.php inurl:submit.pl inurl:suggest.php?action= inurl:sunbbs.cgi?mode= inurl:tnote.cgi inurl:treebbs.cgi inurl:ttboard.cgi?act= inurl:upb.cgi inurl:upbbs.cgi inurl:user.php inurl:view.php?id=9&action=new inurl:write.asp inurl:write.php?uid= inurl:wwwboard.cgi inurl:yapgb.php?action= inurl:yuu-fantasy.cgi inurl:yybbs.cgi inurl:zboard.php?id= inurl:0815guestbooks.de inurl:100pro-gaestebuch.de/gbserver/ inurl:12book.de/gaestebuch inurl:Gb/Sign_Guestbook.asp inurl:Gbook/Sign_Guestbook.asp inurl:GuestBook/gst_sign.dbm inurl:Guestbook/Sign_Guestbook.asp inurl:Guestbook_eintrag.htm inurl:Sign_Guestbook.asp inurl:addbook.cgi inurl:addentry inurl:addguest inurl:addguest.html inurl:addguest.php inurl:addguestGB2.cgi inurl:addmessage inurl:apeboard inurl:bbs inurl:burning inurl:epad inurl:feedbook.de inurl:flash_gb9.php?id= inurl:flf-book.de inurl:free-guestbooks.de/gbserver/ inurl:freeguestbook.de/addbook.cgi? inurl:freeguestbook.de/readbook.cgi? inurl:freeguestbook4you.de gaestebuch-umsonst.ws inurl:gaestebuch. inurl:gaestebuch.007box.de inurl:gaestebuch.php inurl:gaestebuch.php? inurl:gaestebuch/neu.php inurl:gaestebuch4u.de inurl:gaestebuchking.de inurl:gastbuch.php inurl:gastbuch.php3 inurl:gastbuch.php?id= inurl:gb.cgi inurl:gb.php?user= inurl:gb.webmart.de inurl:gb.webmart.de/gb.cfm?id= inurl:gb/addguest.html inurl:gb/guest.pl inurl:gb/sign.html inurl:gb2003.de inurl:gb_eintrag.php? inurl:gbook.cgi inurl:gbook.tv inurl:gbook/addguest.html inurl:gbook/guest.pl inurl:gbook/sign.html inurl:gbserver.de inurl:gratis-gaestebuch.de inurl:gratis-gaestebuch.eu/firebook.cgi? inurl:gst_sign.dbm inurl:guessbook/sign.html inurl:guest. inurl:guest.pl inurl:guest_book/guest.pl inurl:guestb inurl:guestbook inurl:guestbook-free.com/books inurl:guestbook-free.com/books2 inurl:guestbook.cgi inurl:guestbook.onetwomax.de inurl:guestbook/a=sign inurl:guestbook/addguest.html inurl:guestbook/guest.pl inurl:guestbook/sign.html inurl:guestbook24.com/gastbuch.php inurl:guestbook24.eu inurl:guestbook4you.de/gb.php? inurl:iboox.com inurl:multiguestbook.com inurl:my-gaestebuch.de inurl:netguestbook.com inurl:new.html#sign inurl:power-guestbook.de inurl:regsign.cgi inurl:sign.fcgi inurl:sign.html inurl:sign_book.cgi inurl:wgbsign.html site:com “powered by BlogEngine.NET” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:edu “powered by BlogEngine.NET” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:org “powered by BlogEngine.NET” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:gov “powered by BlogEngine.NET” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:com “powered by BlogEngine.NET” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:org “powered by BlogEngine.NET” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:edu “powered by BlogEngine.NET” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:gov “powered by BlogEngine.NET” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:com “powered by BlogEngine.NET” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:org “powered by BlogEngine.NET” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:edu “powered by BlogEngine.NET” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:gov “powered by BlogEngine.NET” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:com “powered by BlogEngine.NET” "post a comment" -"comments closed" -"you must be logged in" site:edu “powered by BlogEngine.NET” "post a comment" -"comments closed" -"you must be logged in" site:org “powered by BlogEngine.NET” "post a comment" -"comments closed" -"you must be logged in" site:gov “powered by BlogEngine.NET” "post a comment" -"comments closed" -"you must be logged in" site:com “powered by BlogEngine.NET” "Leave a comment" -"comments closed" -"you must be logged in" site:org “powered by BlogEngine.NET” "Leave a comment" -"comments closed" -"you must be logged in" site:edu “powered by BlogEngine.NET” "Leave a comment" -"comments closed" -"you must be logged in" site:gov “powered by BlogEngine.NET” "Leave a comment" -"comments closed" -"you must be logged in" site:com “powered by BlogEngine.NET” "add a comment" -"comments closed" -"you must be logged in" site:org “powered by BlogEngine.NET” "add a comment" -"comments closed" -"you must be logged in" site:edu “powered by BlogEngine.NET” "add a comment" -"comments closed" -"you must be logged in" site:gov “powered by BlogEngine.NET” "add a comment" -"comments closed" -"you must be logged in" site:com “powered by BlogEngine.NET” "post a comment" site:edu “powered by BlogEngine.NET” "post a comment" site:org “powered by BlogEngine.NET” "post a comment" site:gov “powered by BlogEngine.NET” "post a comment" site:com “powered by BlogEngine.NET” "Leave a comment" site:org “powered by BlogEngine.NET” "Leave a comment" site:edu “powered by BlogEngine.NET” "Leave a comment" site:gov “powered by BlogEngine.NET” "Leave a comment" site:com “powered by BlogEngine.NET” "add a comment" site:org “powered by BlogEngine.NET” "add a comment" site:edu “powered by BlogEngine.NET” "add a comment" site:gov “powered by BlogEngine.NET” "add a comment" site:com “powered by BlogEngine.NET” inurl:blog "post a comment" site:edu “powered by BlogEngine.NET” inurl:blog "post a comment" site:org “powered by BlogEngine.NET” inurl:blog "post a comment" site:gov “powered by BlogEngine.NET” inurl:blog "post a comment" site:com “powered by BlogEngine.NET” inurl:blog "Leave a comment" site:org “powered by BlogEngine.NET” inurl:blog "Leave a comment" site:edu “powered by BlogEngine.NET” inurl:blog "Leave a comment" site:gov “powered by BlogEngine.NET” inurl:blog "Leave a comment" site:com “powered by BlogEngine.NET” inurl:blog "add a comment" site:org “powered by BlogEngine.NET” inurl:blog "add a comment" site:edu “powered by BlogEngine.NET” inurl:blog "add a comment" site:gov “powered by BlogEngine.NET” inurl:blog "add a comment" site:edu "powered by BlogEngine.NET" site:com "powered by BlogEngine.NET" site:gov "powered by BlogEngine.NET" site:org "powered by BlogEngine.NET" “powered by BlogEngine.NET” site:com “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:edu “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:org “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:gov “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:com “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:org “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:edu “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:gov “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:com “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:org “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:edu “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:gov “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:com “Powered by BlogEngine.NET 1.4.5.0” "post a comment" -"comments closed" -"you must be logged in" site:edu “Powered by BlogEngine.NET 1.4.5.0” "post a comment" -"comments closed" -"you must be logged in" site:org “Powered by BlogEngine.NET 1.4.5.0” "post a comment" -"comments closed" -"you must be logged in" site:gov “Powered by BlogEngine.NET 1.4.5.0” "post a comment" -"comments closed" -"you must be logged in" site:com “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" -"comments closed" -"you must be logged in" site:org “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" -"comments closed" -"you must be logged in" site:edu “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" -"comments closed" -"you must be logged in" site:gov “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" -"comments closed" -"you must be logged in" site:com “Powered by BlogEngine.NET 1.4.5.0” "add a comment" -"comments closed" -"you must be logged in" site:org “Powered by BlogEngine.NET 1.4.5.0” "add a comment" -"comments closed" -"you must be logged in" site:edu “Powered by BlogEngine.NET 1.4.5.0” "add a comment" -"comments closed" -"you must be logged in" site:gov “Powered by BlogEngine.NET 1.4.5.0” "add a comment" -"comments closed" -"you must be logged in" site:com “Powered by BlogEngine.NET 1.4.5.0” "post a comment" site:edu “Powered by BlogEngine.NET 1.4.5.0” "post a comment" site:org “Powered by BlogEngine.NET 1.4.5.0” "post a comment" site:gov “Powered by BlogEngine.NET 1.4.5.0” "post a comment" site:com “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" site:org “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" site:edu “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" site:gov “Powered by BlogEngine.NET 1.4.5.0” "Leave a comment" site:com “Powered by BlogEngine.NET 1.4.5.0” "add a comment" site:org “Powered by BlogEngine.NET 1.4.5.0” "add a comment" site:edu “Powered by BlogEngine.NET 1.4.5.0” "add a comment" site:gov “Powered by BlogEngine.NET 1.4.5.0” "add a comment" site:com “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" site:edu “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" site:org “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" site:gov “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "post a comment" site:com “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" site:org “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" site:edu “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" site:gov “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "Leave a comment" site:com “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" site:org “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" site:edu “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" site:gov “Powered by BlogEngine.NET 1.4.5.0” inurl:blog "add a comment" site:edu "Powered by BlogEngine.NET 1.4.5.0" site:com "Powered by BlogEngine.NET 1.4.5.0" site:gov "Powered by BlogEngine.NET 1.4.5.0" site:org "Powered by BlogEngine.NET 1.4.5.0" “Powered by BlogEngine.NET 1.4.5.0” site:com “powered by expressionengine” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:edu “powered by expressionengine” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:org “powered by expressionengine” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:gov “powered by expressionengine” inurl:blog "post a comment" -"comments closed" -"you must be logged in" site:com “powered by expressionengine” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:org “powered by expressionengine” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:edu “powered by expressionengine” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:gov “powered by expressionengine” inurl:blog "Leave a comment" -"comments closed" -"you must be logged in" site:com “powered by expressionengine” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:org “powered by expressionengine” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:edu “powered by expressionengine” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:gov “powered by expressionengine” inurl:blog "add a comment" -"comments closed" -"you must be logged in" site:com “powered by expressionengine” "post a comment" -"comments closed" -"you must be logged in" site:edu “powered by expressionengine” "post a comment" -"comments closed" -"you must be logged in" site:org “powered by expressionengine” "post a comment" -"comments closed" -"you must be logged in" site:gov “powered by expressionengine” "post a comment" -"comments closed" -"you must be logged in" site:com “powered by expressionengine” "Leave a comment" -"comments closed" -"you must be logged in" site:org “powered by expressionengine” "Leave a comment" -"comments closed" -"you must be logged in" site:edu “powered by expressionengine” "Leave a comment" -"comments closed" -"you must be logged in" site:gov “powered by expressionengine” "Leave a comment" -"comments closed" -"you must be logged in" site:com “powered by expressionengine” "add a comment" -"comments closed" -"you must be logged in" site:org “powered by expressionengine” "add a comment" -"comments closed" -"you must be logged in" site:edu “powered by expressionengine” "add a comment" -"comments closed" -"you must be logged in" site:gov “powered by expressionengine” "add a comment" -"comments closed" -"you must be logged in" site:com “powered by expressionengine” "post a comment" site:edu “powered by expressionengine” "post a comment" site:org “powered by expressionengine” "post a comment" site:gov “powered by expressionengine” "post a comment" site:com “powered by expressionengine” "Leave a comment" site:org “powered by expressionengine” "Leave a comment" site:edu “powered by expressionengine” "Leave a comment" site:gov “powered by expressionengine” "Leave a comment" site:com “powered by expressionengine” "add a comment" site:org “powered by expressionengine” "add a comment" site:edu “powered by expressionengine” "add a comment" site:gov “powered by expressionengine” "add a comment" site:com “powered by expressionengine” inurl:blog "post a comment" site:edu “powered by expressionengine” inurl:blog "post a comment" site:org “powered by expressionengine” inurl:blog "post a comment" site:gov “powered by expressionengine” inurl:blog "post a comment" site:com “powered by expressionengine” inurl:blog "Leave a comment" site:org “powered by expressionengine” inurl:blog "Leave a comment" site:edu “powered by expressionengine” inurl:blog "Leave a comment" site:gov “powered by expressionengine” inurl:blog "Leave a comment" site:com “powered by expressionengine” inurl:blog "add a comment" site:org “powered by expressionengine” inurl:blog "add a comment" site:edu “powered by expressionengine” inurl:blog "add a comment" site:gov “powered by expressionengine” inurl:blog "add a comment" site:edu "powered by expressionengine" site:com "powered by expressionengine" site:gov "powered by expressionengine" site:org "powered by expressionengine" “powered by expressionengine” inurl:"title=Dyskusja_u%C5%BCytkownika:" inurl:"/wiki/index.php" "Theme: Strasa - Mono" wiki "you only need to fill in when" categorywiki "This is an alphabetical list of pages you can read on this server." "Login/Register" inurl:"title=%EC%82%AC%EC%9A%A9%EC%9E%90%ED%86%A0%EB%A1%A0:" inurl:"title=U%C5%BEivatel_diskuse:" "Theme: Fluid Index by Your Index" inurl:"title=Discussion_utilisateur:" "Welcome to MoinMoin. You will find here the help pages for the wiki system itself." "Wiki:About" inurl:"Speciaal:Aanmelden" wiki inurl:"title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:" inurl:"CategoryWiki" inurl:"Especial:Entrar" wiki inurl:"title=Discussioni_utente:" inurl:"/mediawiki/index.php" "The wiki, blog, calendar, and mailing list" inurl:"Istimewa:Masuk_log" wiki inurl:"title=%E4%BD%BF%E7%94%A8%E8%80%85%E8%A8%8E%E8%AB%96:" inurl:"title=%E0%B8%84%E0%B8%B8%E0%B8%A2%E0%B9%80%E0%B8%81%E0%B8%B5%E0%B9%88%E0%B8%A2%E0%B8%A7%E0%B8%81%E0%B8%B1%E0%B8%9A%E0%B8%9C%E0%B8%B9%E0%B9%89%E0%B9%83%E0%B8%8A%E0%B9%89:" inurl:"title=Usu%C3%A1rio_Discuss%C3%A3o:" inurl:"Speciale:Entra" wiki "Powered by WikkaWiki" inurl:"tiki-register.php" "dokuwiki.txt" "Tema: Fivealive - Lemon" inurl:"%E7%89%B9%E5%88%A5:%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3" wiki Categories PageIndex Recent Changes Recently Commented "Login/Register" "" "" "Powered by Tikiwiki CMS/Groupware" inurl:"title=Utilizador_Discuss%C3%A3o:" "Tema: Fivealive" "This page was last modified on" "wiki" inurl:"Specjalna:Zaloguj" wiki "Thanks for installing Wikka! This wiki runs on version" inurl:"http://wikka." "Theme: Coelesce" "Powered By MediaWiki" inurl:wiki "Theme: Fivealive - Kiwi" inurl:"Utente:" wiki "recentchanges" "findpage" "helpcontents" inurl:"Sp%C3%A9cial:Connexion" wiki inurl:"Pengguna:" wiki "MoinMoin Powered" "Python Powered" inurl:"title=%E0%B4%89%E0%B4%AA%E0%B4%AF%E0%B5%8B%E0%B4%95%E0%B5%8D%E0%B4%A4%E0%B4%BE%E0%B4%B5%E0%B4%BF%E0%B4%A8%E0%B5%8D%E0%B4%B1%E0%B5%86_%E0%B4%B8%E0%B4%82%E0%B4%B5%E0%B4%BE%E0%B4%A6%E0%B4%82:" inurl:"U%C5%BCytkownik:" wiki inurl:"Speciel:Log_p%C3%A5" wiki "Powered By MediaWiki" "Powered By MediaWiki" inurl:wiki "what links here" "related changes" "special pages" inurl:Special:Whatlinkshere "There is currently no text in this page, you can search..." "Powered by wikkawiki" inurl:wiki/RecentlyCommented "pageindex" "recentchanges" "recentlycommented" "you only need to fill in when" categorywiki "MoinMoin Powered" "MoinMoin Powered" "Python Powered" "recentchanges" "findpage" "helpcontents" "powered by tikiwiki" "powered by tikiwiki" inurl:tiki-index.php Powered by TikiWiki CMS/Groupware v2 inurl:tiki-register.php

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

CGI визначає як дані, надані клієнтом у запиті, передаються програмі, як програма повертає згенерований HTML-контент серверу, і які змінні оточення встановлюються сервером під час запуску програми. Змінні оточення несуть додаткову інформацію про сервер та запит (наприклад, тип сервера, IP-адреса клієнта та ін.).

Дані із заповненої клієнтом HTML-форми можуть передаватися на сервер двома методами: GET та POST, це визначається параметром методвідповідного тега<form method=... action=...>. У першому випадку (GET) дані приєднуються після знака запитання в кінець URL, зазначеної в параметрі action, у другому випадку - передаються в тілі запиту - в секції, призначеної для даних (слід після всіх заголовків і порожнього рядка). В обох випадках дані кодуються однаково - див. пункт.

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

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

Content-Type: text/html

Hello, world

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

Для того, щоб Apache сприймав усі файли, що знаходяться в деякому каталозі як CGI-скрипти, потрібно використовувати директиву

ScriptAlias ​​/ віртуальний/шлях/ /шлях/до/каталогу/ ScriptAlias ​​/cgi-bin/ /usr/local/www/cgi-bin/ Це означає, що для обробки запиту URL виду http://your.server.com/cgi-bin/dir/script буде взято не файл script з каталогу DocumentRoot/cgi-bin/dir/, а запущено програму /usr/local/www/cgi-bin/dir/script.

Для змішаного зберігання файлів, що підлягають перегляду, та CGI-скриптів в одному каталозі всередині дерева DocumentRootслід присвоїти CGI-скриптам однакові розширення (наприклад, ".cgi") і вказати серверу, що інтерпретувати такі файли слід як CGI-скрипти:

AddHandler cgi-script .cgi Директива AddHandler може бути використана у будь-якому контексті конфігурації Apache.

Структура URL та кодування даних запиту

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

http://my.server.com/cgi-bin/dir/prog/a/b?A=1&B=qwerty

Використовуючи директиву ScriptAlias, наведену в попередньому пункті, сервер визначає, що сталося звернення до CGI-програми і для пошуку цієї програми замінює початкове /cgi-bin/на /usr/local/www/cgi-bin/. Наслідуючи запитану URL, сервер виявляє в цьому каталозі підкаталог dir, проте підкаталогу progв каталозі /usr/local/www/cgi-bin/dirне виявлено. У такому разі сервер припускає, що prog- ім'я CGI-програми, що підлягає виконанню. Якщо програма /usr/local/www/cgi-bin/dir/progне знайдена або не може бути виконана, сервер повертає клієнту помилку 403, 404 або 500. В іншому випадку програма prog запускається, а частина шляху, що залишилася з URL - /a/b- передається програмі prog у змінній оточенні PATH_INFO. У такий спосіб можна передати до CGI-програми додаткові параметри.

Все, що знаходиться після знаку питання - A=1&B=qwerty- передається програмі prog у змінній оточенні QUERY_STRING. Це можуть бути дані із заповненої користувачем форми, відправлені на сервер методом GET, або якась інша інформація (сервер не робить жодних припущень про інтерпретацію даних у QUERY_STRING, це завдання програми, що викликається).

Дані з полів форми, заповненої користувачем – незалежно від методу (POST або GET), яким вони пересилаються на сервер – кодуються таким чином:

ім'я_поля=значення_поля&ім'я_поля=значення_поля...

Пари ім'я-значення поділяються амперсандом. Алфавітно-цифрові символи та деякі розділові знаки, що не мають спеціального значення (тире, підкреслення) передаються як є. Інші символи кодуються у вигляді " %NM ", де NM- двозначний шістнадцятковий код символу. Пробіл може передаватися як "%20" або символ "+". Кирилічні символи також повинні кодуватись вказаним способом. Кодування провадиться броузером при відправленні полів заповненої форми.

Наприклад:

Http://my.server.com/cgi-bin/dir/prog?birthday=11%2F05%2F73&name=John+Smith означає, що в полі birthdayкористувач вніс "11/05/73", а в полі name- "John Smith".

Декодування даних форми є завданням CGI-програми.

При надсиланні даних форми, закодованих вищеописаним способом, методом POST клієнт повинен встановити заголовок запиту Content-Type наступним чином:

Content-Type: application/x-www-form-urlencoded

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

Під час запуску CGI-скрипту веб-сервер встановлює додаткові змінні оточення:

Змінна Значення
AUTH_TYPE

Метод аутентифікації, використаний для пізнання користувача. також REMOTE_USER і REMOTE_IDENT.

CONTENT_LENGTH

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

CONTENT_TYPE

MIME тип даних запиту.

DOCUMENT_ROOT

Кореневий каталог дерева документів веб-сервера (визначається директивою DocumentRoot).

GATEWAY_INTERFACE

Версія CGI, що використовується.

HTTP_ACCEPT

Список MIME типів даних, які клієнт може прийняти.

HTTP_FROM

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

HTTP_REFERER
HTTP_USER_AGENT

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

PATH_INFO PATH_INFO (якщо є) - див. вище " "
PATH_TRANSLATED

PATH_INFO, перетворений на повний шлях у файловій системі сервера (PATH_INFO, доданий до DOCUMENT_ROOT).

QUERY_STRING

Дані запиту, передані у складі URL слідом за знаком питання - див. вище " ".

REMOTE_ADDR

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

REMOTE_HOST Ім'я клієнта DNS.
REMOTE_USER Аутентифіковане ім'я користувача.
REQUEST_METHOD

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

SCRIPT_NAME Віртуальний шлях (наприклад, /cgi-bin/program.pl) до виконуваного CGI-скрипту.
SERVER_NAME DNS-ім'я сервера або, за неможливості визначити ім'я, його IP-адресу.
SERVER_PORT

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

SERVER_PROTOCOL Ім'я та версія протоколу, через який було зроблено запит (наприклад, HTTP/1.1).
SERVER_SOFTWARE

Тип і номер версії веб-сервера.

З Apache поставляється стандартний тестовий скрипт test-cgi, що виводить закінчення змінних оточення CGI.

Cookies та інші методи збереження стану

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

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

Існує кілька методів збереження стану:

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

Два останніх методи реалізують збереження стану на стороні сервера.

База даних

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

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

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

Файл

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

Збереження стану на стороні користувача

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

Cookies

Cookies - це дані виду ім'я=значення, які, будучи отримані від сервера, зберігаються броузером на диску користувача для повернення серверу при наступних запитах до цього або іншого URL. Оскільки дані зберігаються на диску, їх можна використовувати після перезапуску броузера.

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

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

Set-Cookie: ім'я=значення; Max-Age = секунди; Comment= текстовий_коментар; Path= URI_або_частина_URI; Domain= домен_сервера; Secure; Version=1

Усі елементи, крім ім'я=значенняі Version не є обов'язковими. У заголовку однієї відповіді сервера може бути кілька полів Set-Cookie.

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

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

Comment= текстовий_коментаркоментар сервера щодо призначення cookie; передбачається, що користувач може відмовитись працювати з цим cookie, якщо коментар йому не сподобається.

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

Path= URI_або_частина_URIшлях від кореня дерева документів сервера (URI); броузер повинен повертати cookie при зверненні до даного URI і всіх URI, що починається з даного; за замовчуванням – URI, при запиті якого було згенеровано cookie, мінус ім'я файлу.

Приклад: при зверненні на "http://s.vvsu.ru/a/b/c" сервер видав відповідь із встановленим полем у заголовку:

SetCookie: X = 5; Version=1 Це означає, що cookie повертається броузером при зверненні на всі URL виду "http://s.vvsu.ru/a/b/ якесь_ім'я_файлу".
Якщо ж SetCookie у відповіді сервера виглядає так: SetCookie: X=5; Domain = .vvsu.ru; Path=/a/; Version=1 то броузер повинен приєднувати це cookie до всіх запитів URL виду: "http:// ім'я_без_точки.vvsu.ru/a/b/ якийсь_шлях_або_ніякого".

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

Формат поля cookie (HTTP-запит)

Cookie: ім'я=значення; Path= URI_або_частина_URI; Domain= домен_сервера; Version=1

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

Приховані поля

Приховане поле створюється всередині форми за допомогою тега
name1 value= value1>

Коли браузер отримує документ із цією формою, вміст полів типу "hidden" не відображається і користувач не знає про їхнє існування (якщо тільки не подивиться у HTML-текст надісланого документа). Після того, як користувач надсилає форму на сервер, пара " name1=value1Приєднується до даних форми, які будуть оброблені знову запущеним скриптом. Таким чином скрипт може отримати дані про передісторію своєї роботи з користувачем. у цьому сеансі роботи.

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

Server Side Includes

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

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

Нижче наведено список основних директив SSI та їх параметрів.

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

Ви прийшли на сервер, що знаходиться за адресою...

includeВставляє в документ текст іншого файлу. Параметри: file- вказує шлях до файлу, що вставляється щодо розташування даного документа; virtual- вказує віртуальний шлях (як він вказувався б в URL) до файлу, що вставляється.

Ця директива дуже зручна для створення стандартних шапок та підвалів веб-сторінок.

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

Розмір файлу archive.zip -bytes.

flastmodВставляє в документ дату та час останньої модифікації вказаного у параметрі файлу (шлях до файлу віртуальний):

Дата останньої зміни:bytes. Формат виведення дати та часу може бути специфікований параметром timefmtдирективи config.

execВиконує зовнішню програму, вказану параметром, та вставляє виведення цієї програми в документ. Параметри: cmd- Виконувана програма є якимось звичайним додатком; cgi- виконувана програма є CGI-скриптом

На цю сторінку заходилиразів. У першому прикладі використовується підстановка значень змінних оточення (див. CGI-змінні).

configМодифікує різноманітні аспекти роботи SSI. Параметри:

  • errmsg - повідомлення про помилку, що видається за неможливості виконати директиву:
  • sizefmt - встановлює формат виведення розміру файлу (підставлюваного директивою) fsize; значення: bytes- виводить у байтах; abbrev- Округлює до цілого числа кілобайт.Розмір файлу archive.zip - приблизноbytes.
  • timefmt - встановлює формат виведення дати та часу, докладніше див.

Спеціальні змінні SSI

Нижче наведено змінні SSI, які можна використовувати у директиві echoна додаток до змінних CGI.

DOCUMENT_NAME Ім'я цього документа. Наприклад:

Ви читаєте файл під назвою:

DOCUMENT_URL Віртуальний шлях до цього документа. Наприклад:

QUERY_STRING_UNESCAPED Декодовані дані з QUERY_STRING (см " "), при цьому всі метасимволи шелла екрановані зворотним слешем (\).

DATE_LOCAL Поточна дата та час за місцевим часом. Наприклад:

Зараз

DATE_GMT Поточні дата та час за Грінвічем.

LAST_MODIFIED
Дата та час останньої модифікації цього документа. Наприклад:

Цей файл востаннє змінено

Завдання

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

Правила гри

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

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

Гра припиняється, якщо кількість спроб дорівнювала нулю (користувач програв) або якщо вгадані всі літери в слові (користувач виграв).

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

Реалізація

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

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

При першому зверненні до скрипту видається заставка та реєстраційна форма виду.

Рекомендуємо почитати

Вгору