|
 |
Путь: >
Новичкам
Новичкам
Автор: - Yurik
Дата публикации - 21.5.2005
Просмотров: - 4111
Основы: CGI - общий принцип работы веб-приложений
CGI (Common Gateway Interface) - интерфейс общего доступа - первый механизм встраивания приложений в веб-узел. С его помощью разработчики могут писать приложения, которые интерактивно взаимодействуют с пользователем. CGI - это не язык, это набор стандартов который определяет способ взаимодействия веб-сервера и приложения.
CGI - это спецификация которая определяет как приложение будет получать и отправлять информацию через посредство веб-сервера.
CGI работает как с компилируемыми програмами так и с интерпретируемыми (сценариями).
[p]Как работает CGI[/p]
Для того чтобы приложение могло быть встроено в веб-узел, необходимо выполнить два общих условия. Во-первых, приложение должно получать данные от веб-броузера и веб-сервера, во вторых - возвращать результат выполнения броузеру.
Понимание CGI невозможно без знания основ HTTP. HTTP соединение представляет собой канал связи между веб-сервером и броузером. Большинство соединений HTTP инициируются клиентом, когда броузер посылает запрос на получение документа. В начале запроса располагается раздел, называемый заголовком. Вот некоторые наиболее частые заголовки
| GET | POST | Основной заголовок, он указывает метода запроса (основных их два - GET или POST) и документ который нужно возвратить (возможно с параметрами), а также версию HTTP, например GET /info.php HTTP/1.1 |
| Accept | Указывает какие MIME типы документов понимает броузер |
| Accept-Encoding | Указывает какие типы кодировки понимает клиент, например gzip, deflate |
| Accept-Language | Используется для content-negotiation. Указывает предпочтения пользователя к языкам содержимого, например: uk,en-us;q=0.5 |
| Connection | Тип подключения, наиболее часто close или Keep-Alive |
| Cookie | Содержимое кук |
| Host | Какому хосту (домену) адресован запрос |
| User-Agent | Идентификация броузера, например Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; BCD2000) |
| Authorization | Информация о http-аутентификации |
| Pragma | Специальные инструкции для прокси-серверов, позволяющие или запрещающие кеширование документов и/или заголовков |
| Referer | Содержит URL предыдущего документа включающего ссылку с помощью которой пользователь пришел на текущий документ |
После получения HTTP-запроса сервер обрабатывает его, выдавая требуемый документ, если таковой существует, и закрывает соединение HTTP. Непосредственно перед документом сервер посылает броузеру заголовок ответа HTTP. В заголовке содержится информация о документе. Вот некоторые поля:
| Keep-Alive | timeout=15, max=99 |
| Connection | Keep-Alive |
| Transfer-Encoding | chunked |
| Date | |
| Last-modified | |
| Server | |
| Content-Type | Последний заголовок (после него идет непосредственно документ, поэтому он всегда последний), указывает MIME-тип возвращаемого докмента, наиболее часто он имеет вид: text/html; charset=windows-1251 |
| Location | Перенаправление броузера на другой URL, например 'Location: url=http://www.pupkin.com/cgi-bin/otherdoc' | ]http://www.pupkin.com/cgi-bin/otherdoc'/url]
| Status | Содержит коды статуса HTTP |
Вот коды статуса HTTP (обычно возвращаются когда по какой-либо причине документ не может быть отправлен)
[code]Status-Code = "100" ; Continue
| "101" ; Switching Protocols
| "200" ; OK
| "201" ; Created
| "202" ; Accepted
| "203" ; Non-Authoritative Information
| "204" ; No Content
| "205" ; Reset Content
| "206" ; Partial Content
| "300" ; Multiple Choices
| "301" ; Moved Permanently
| "302" ; Moved Temporarily
| "303" ; See Other
| "304" ; Not Modified
| "305" ; Use Proxy
| "400" ; Bad Request
| "401" ; Unauthorized
| "402" ; Payment Required
| "403" ; Forbidden
| "404" ; Not Found
| "405" ; Method Not Allowed
| "406" ; Not Acceptable
| "407" ; Proxy Authentication Required
| "408" ; Request Time-out
| "409" ; Conflict
| "410" ; Gone
| "411" ; Length Required
| "412" ; Precondition Failed
| "413" ; Request Entity Too Large
| "414" ; Request-URI Too Large
| "415" ; Unsupported Media Type
| "500" ; Internal Server Error
| "501" ; Not Implemented
| "502" ; Bad Gateway
| "503" ; Service Unavailable
| "504" ; Gateway Time-out
| "505" ; HTTP Version not supported[/code]
Когда вместо статического документа заголовок запроса указывает на CGI приложение, веб-сервер запускает его и помещает в переменные окружения основную часть заголовокв запроса. Эту информацию приложение поучает по стандартному каналу ввода (В Perl например так read(STDIN, $string, $ENV{'CONTENT_LENGTH'}) или $string=$ENV{'QUERY_STRING'}).
Когда приложение отработало, вся информация через стандартный вывод (STDOUT) передается назад на анализ серверу. Он разбирает этот ответ на заголовки и собственно документ.
Приложение может возвращать два вида заголовков:
- Частичные (parsed)
- Полные (non-parsed)
При получении частичного заголовка сервер анализирует его и, в соответствии со своей конфигурацией, добавляет недостающие заголовки. Полные заголовки не требуют никаких действий и отправляются как есть.
Основной заголовок который должно возвратить приложение - Content-type. Его достаточно серверу чтобы отправить документ.
[p]Пример приложения CGI[/p]
[code]#!/usr/local/bin/perl
print "Content-type: text/text\n\n";
print "Hello World";
[/code]
Это приложение сначала возвращает заголовок (после заголовков всегда следует пустая строка - \n\n). Все что выводится после заголовка Content-type считается содержиммым.
[code]#!/usr/local/bin/perl
print "Content-type: text/text\n\n";
print "Location: url=http://www.pupkin.com/cgi-bin/user.pl\n\n";]http://www.pupkin.com/cgi-bin/user.pl\n\n";/url]
print "Hello World";
[/code]
В этом примере второй заголовок Location: не сработает а просто выведется в броузе ркак текст, потомму что он стоит после заголовка Content-type
[p]Особенности PHP как CGI[/p]
Всё вышесказанное касается и PHP, независимо от того, установлен он как CGI или как модуль Apache/IIS, только PHP, как язык более высокого уровня, имеет ряд отличий:
- Вывод заголовков ответа и собственно содержимого производится не на стандартный вывод, а через соответствующие функции: print(); директиву echo; и заголовки через функцию header();.
- Любой вывод через print или echo автоматически посылает перед ним заголовок Content-type: XXXXXX, где XXXXXX выставляется в конфигурации:
[quote]<b>php.ini</b><br>
default_mimetype="text/html"<br>
default_charset="windows-1251"
[/quote]
- Посылать заголовки можно даже после вывода содержимого, если включен буфер вывода. В конце работы PHP автоматически расставит всё на свои места, даже если вы напутали порядок вывода.
- PHP автоматически преобразует заголовки запроса в удобные переменные. Сравните для примера код получения переменной в PHP и Perl (или C):
[code]<?php
echo $_GET['var'];
// и сравните тот же код в Perl
?>
#!usr/local/bin/perl
$user_string=$ENV{'QUERY_STRING'};
$user_string=~ s/\+/ /g;
@name_value_pairs=split(/&/,$user_string);
foreach $name_value_pair (@name_value_pairs){
($name, $value)=split(/=/, $name_value_pair);
$name=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ge;
$value=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ge;
if (defined($_GET{$name})){
$_GET{$name}.=":".$value;
} else {
$_GET{$name}=$value;
}
}
print "Content-type: text/text\n\n";
print $_GET{'var'};
[/code]
[p]Другие переменные окружения[/p]
Как было сказано, веб-сервер помещает в переменные окружения данные из заголовка запроса. Но кроме этих данных, туда попадают также другая служебная информация. Вот основные переменные окуржения CGI:
| AUTH_TYPE | Метод аутентификации используемый веб-броузером |
| CONTENT_LENGTH | Длина в символах данных запроса передаваемых на стандартный ввод |
| CONTENT_TYPE | Тип MIME информации пользователя |
| DOCUMENT_ROOT | Корневой каталог дерева документов сервера |
| GATEWAY_INTERFACE | Версия CGI. CGI/1.1 |
| HTTP_ACCEPT | HTTP_ + одноименный заголовок запроса |
| HTTP_REFERER | HTTP_ + одноименный заголовок запроса |
| HTTP_USER_AGENT | HTTP_ + одноименный заголовок запроса |
| PATH_INFO | Дополнительная информация о пути |
| PATH_TRANSLATED | Физический путь на серверной машине, полученный веб-сервером из запрошенного виртуального пути |
| QUERY_STRING | |
| REMOTE_ADDR | |
| REMOTE_HOST | |
| REMOTE_IDENT | |
| REMOTE_USER | |
| REQUEST_METHOD | |
| SCRIPT_NAME | |
| SERVER_NAME | |
| SERVER_PORT | |
| SERVER_PROTOCOL | |
| SERVER_SOFTWARE | |
Обсудить в ФОРУМе - комментариев ()
Путь: >
Новичкам
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|
|