Webmasterpro.com.ua - первый украинский сайт о поисковых системах. Оптимизация сайта в поисковиках, поисковая раскрутка. Хостинг


8590 seo-документов в поиске, с 2001 года



Реклама на сайте

 Хостинг
Платный хостинг
Бесплатный хостинг

Регистрация доменов

 Статьи
Яндекс
Google
Все поисковые системы
Оптимизация - основы
Баннерная реклама
Общие вопросы рекламы
Реклама в интернет
Маркетинг в интернет
Website management
Email-маркетинг
Почтовые рассылки
Спам и борьба с ним
Разработка сайта
Веб-дизайн
Usability
Каскадные таблицы стилей
HTML
Базы данных
Таблицы
MySQL
CGI
xDSL
Партнерские программы
Электронная коммерция
Выбор хостинга
Доменные имена
Провайдеры
Сервера
А также
Пресс-релизы
Каталог сайтов
Партнерские программы
Платный хостинг
Регистрация доменов
Раскрутка сайта
High-Tech портал

 Партнерские программы:
Продажа хостинга, регистрация доменов 
% от первого и последующих платежей клиентов за хостинг и регистрацию доменов
ZenBroker - продажа ссылок, реклы есть
Добавляем все сайты в систему и получаем доход

добавить рекламный блок

Спецификация Common Gateway Interface

Раздел: CGI 06-12-2004 FAQ оптимизатору на форуме ZenBroker


Данная спецификация определяет стандартный способ обмена данными между прикладной программой и http-сервером. Спецификация была предложена для сервера NCSA и является основным средством расширеня возможностей обработки запросов клиентов http-сервером.

Основное назначение CGI - обработка данных из HTML-форм. В настоящее область применения CGI гораздо шире.

Понятие CGI-скрипта CGI-скриптом называют программу, написанную на любом языке программирования или командном языке, которая осуществляет обмен данными с http-сервером в соответствии со спецификацией Common Gateway Interface. Наиболее популярными языками для разработки скриптов являются Perl и С.

Типы запросов

Различают два типа запросов к CGI-скриптам: по методу GET и по методу POST. В свою очередь запросы по мотоду GET подразделяются на запросы типам кодирования: ISINDEX и FORM-URLENCODED, а запросы по методу POST - MULTIPART/FORM-DATA и FORM-URLENCODED.

В запросах по методу GET данные от клиента передаются скрипту в переменной окружения QUERY_STRING. В запросах по методу POST данные от скрипта передаются в потоке стандарного ввода скрипта. При передаче через поток стандарного ввода в переменной окружения CONTENT_LENGHT указывается число передаваемых символов.

Запрос типа ISINDEX - это запрос вида:

kuku.ru/somthig-cgi/cgi-script?слово1+слово2+слово3

Главным здесь является список слов после символа "?". Слова перечисляются через символ "+" и для кириллицы не кодируются в шестнадцатиричные последовательности. Последовательность слов после символа "?" будет размещена в переменной окружения QUERY_STRING.

Запрос типа FORM-URLENCODED - это запрос вида:

kuku.ru/somthig-cgi/cgi-script?filed=word1&field2=word2

Данные формы записываются в виде пар "имя_поля-значение", которые разделены символом "&".

Приведенный пример - это обращение к скрипту по методу GET. Все символы после "?" попадут в переменную окружения QUERY_STRING. При этом если в значениях полей появляется кирилица или специальные символы, то они заменяются шестнадцатиричным кодом символа, который следует за символом "%".

При обращении к скрипту по методу POST данные после символа "?" не будут размещаться в QUERY_STRING, а будут напрвалены в поток стандартного ввода скрипта. В этом случае количество сомволов в потоке стандартного ввода скрипта будет указано в переменной окружения CONTENT_LENGTH.

При запросе типа MULTIPART/FORM-DATA применяется составное тело HTTP-сообщения, которое представляет из себя данные введенные в форме и данные присоединенного внешнего файла. Это тело помещается в поток стандартного ввода скрипта. При этом кданным формы применяется кодирование как в FORM-URLENCODED, а данные внешнего файла передаются так как они есть.

Механизмы приема данных скриптом

Скрипт может принять данные от сервера тремя способами:

  • через переменные окружения
  • через аргументы командной строки
  • через поток стандартного ввода

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

Переменные окружения При вызове скрипта сервер выполняет системные вызовы fork и exec. При этом он создает среду выполнения скрипта, определяя переменные этой среды. В спецификации CGI определено 22 переменные окружения. При обращении к скрипту разными методами и из различных контекстов реальные значения принемают разные совокупности этих переменных. Например, при обращении по методу POST переменная QUERY_STRING не имеет значения, а по методу GET такое значение имеет. Другой пример - переменная окружения HTTP_REFERER. При переходе по гипертекстовой ссылке она определена, а если перейти по значению поля location или через JavaScript-программу, то HTTP_REFERER не будет определен.

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

#Perl
$a = $ENV{COTENT_LENGTH};
...
// C
a = getenv("CONTENT_LENGTH");

В случае доступа к скрипту по методу GET данные, которые передаются скрипту, размещаются в переменной окружения QUERY_STRING.

Аргументы командной строки

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

#Perl
foreach $a (@ARGV)
{
print $a,"n";
}

// C
void main(argc,argv)
int argc;
char *argv[];
{
int i;
for(i=0;i {
printf("%sn",argv[i]);
}
}

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

Аргументы командной строки появляются только в запросах типа ISINDEX.

Поток стандарного ввода

Ввод данных в скрипт через поток стандарного ввода осуществляется только при использовании метода доступа к ресурсу(к скрипту) POST. При этом в переменную окружения CONTENT_LENGTH помещается число символов, которое необходимо считать из потока стандарного ввода скрипта, а в переменную окружения CONTENT_TYPE помещается тип кодирования данных, которые считывают из потока стандарного ввода. При посимвольном считывании в С можно применить, например, такой фрагмент кода:

int n;
char *buf;
n= atoi(getenv("CONTENT_LENGTH"));
buf = (char *) malloc(n+1);
memset(buf,"000",n+1);
for(i=0;i {
buf[i]=getchar()
}
...
free(buf);

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

Механизм генерации отклика скриптом Существует толко один способ вернуть данные серверу и соответственно браузеру пользователя - писать в поток стандартного вывода(STDOUT). При этом скрипт должен формировать HTTP-сообщение.

Сначала выводятся директивы HTTP-заголовка. В минимальном варианте - это либо:

Content-type: text/html

либо

Location: kuku.ru/

В первом случае определяется тип тела HTTP-сообщения, а во втором осуществляется перенаправление запроса.

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

#!/bin/sh
echo Content-type: text/plain
echo
echo Hello

В данном случае используется командный интерпретатор sh.

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

Павел Храмцов









 

Новости, статьи и пресс-релизы присылайте на news@webmasterpro.com.ua 
При перепечатке материалов ссылка на WebmasterPro обязательна

Rambler's Top100

Rating@Mail.ru


Copyright © 1999-2006 webmaster@webmasterpro.com.ua