CGI (від англ. Common Gateway Interface — «загальний інтерфейс шлюзу») — стандарт інтерфейсу, який використовується для організації взаємодії програми вебсервера із зовнішньою програмою. Програму, яка працює за таким інтерфейсом спільно з вебсервером, прийнято називати шлюзом. Також вживаються терміни «скрипт» (сценарій) або «CGI-програма».

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

Всі скрипти, як правило, розміщують в каталог cgi-bin сервера, однак це не є обов'язковою умовою: скрипт може знаходитися де завгодно. Також може знадобитися налаштування вебсервера для роботи із програмою-шлюзом. В Apache, наприклад, таке налаштування може бути виконане у загальному файлі налаштувань httpd.conf або за допомогою файлу .htaccess в тому каталозі, де розміщено скрипт. Також Apache дозволяє запускати всі скрипти із розширенням .cgi.

CGI був одним з найпоширеніших засобів створення динамічних вебсторінок.

Призначення інтерфейсу CGI ред.

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

Механізм CGI перенаправляє висновок програми на web-сервер, а той, у свою чергу, в браузер користувача. З точки зору програми немає нічого незвичайного — вона лише виводить інформацію. Абсолютно будь-яка програма не може бути CGI-програмою, тому що перед своїм висновком вона повинна вивести певні заголовки сервера — вказати хоча б тип виведеної інформації. Наприклад, якщо користувач хоче вивести картинку, він повинен відправити заголовок Content-type: image / gif. Якщо CGI-програмі потрібно передати параметри, то робиться це дуже просто — як і у випадку зі звичайною програмою. Наприклад, потрібно передати рядок запиту name=Taras&surname=Grygorovych сценарієм cgi.exe. Для цього необхідно викликати програму cgi.exe з вказаною рядком запиту: cgi.exe name=Taras&surname=Grygorovych.

Розділяють параметри за допомогою символу &. PHP розбирає параметри рядка запиту самостійно.

Такий спосіб посилки параметрів сценарієм (коли дані містяться в командний рядок URL) називається методом GET. Фактично, навіть якщо не передається ніяких параметрів (наприклад, при завантаженні статичної сторінки), все одно застосовується метод GET. Однак, існує ще один поширений спосіб — передача параметрів запиту методом POST.

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

Способи створення CGI-програм ред.

Наведемо приклад CGI-програми на C:

#include <time.h> // Потрібна для ініціалізації функції rand ()
#include <stdio.h> // Включаємо підтримку функцій введення / виводу
#include <stdlib.h> // для підтримки функції rand ()

// Головна функція. Саме вона і запускається при старті сценарію.
void main(void) {
    // ініціалізуємо генератор випадкових чисел
    int Num; time_t t; srand(time(&t));
    // до Num записується випадкове число від 0 до 9
    Num = rand()%10;
    // далі вводимо заголовки відповіді. Тип - html-документ
    printf("Content-type: text/html\n");
    // заборона кешування
    printf("Pragma: no-cache\n");
    // порожній заголовок
    printf("\n");
    // виводимо текст документа - його ми побачимо в браузері
    printf("<html><body>");
    printf("Випадкове число в діапазоні 0-9: %d",Num);
    printf("</body></html>");
}

Посилання ред.

Див. також ред.