Протокол HTTP
Что такое протокол HTTP и для чего он нужен, я думаю расказывать не нужно, поэтому сразу приступим к более подробному рассмотрению. Какое отношение HTTP протокол имеет к Perl? Да самое прямое. Без знания HTTP протокола, нельзя написать практически никакого CGI скрипта.
Итак, договоримся о терминах.
Веб-сервер - програмное обеспечение, которое следит за 80 (возможны и другие варианты, но данный наиболее популярен) портом и в случае обнаружения запроса, выдает некоторую информацию (сообщение об ошибке, html документ).
Клиент - программное обеспечение осуществляющее подключение к 80 порту сервера и посылающее туда запрос.
Помимо выдачи статичных документов, веб-серверы умеют выдавать результаты работы скрипта. т.е. если клиент запрашивает документ, который на самом деле является CGI скриптом, то веб-сервер запускает этот скрипт на выполнение, а всю информацию полученную со стандартного выхода скрипта, перенаправляет клиенту.
В процессе прочтения данного документа, вам наверно захочется попробовать все предложенные примеры. Используйте для этого любой telnet клиент. Просто соединитесь с 80 портом сервера, на котором расположен ваш любимый сайт.
Взаимодействие, между веб-сервером и клиентом просто до неприличия. Клиент посылает запрос состоящий из заголовка и (иногда) тела, а веб-сервер выдает ответ, который так же состоит из заголовка и тела. Рассмотрим более детально, как же выглядят эти запросы и ответы.
Любой запрос начинается строкой:
МЕТОД РЕСУРС HTTP/версия
МЕТОД - один из поддерживаемых веб-сервером методов. Наиболее распространены:
GET - в этом случае выдается запрошенный ресурс. Самый старый и самый распространенный метод.
HEAD - в этом случае, выдается только заголовок документа. Из заголовка можно узнать существует ли документ, его размер и еще некоторую информацию, о которой ниже. Данный метод, как правило, используется для проверки ссылок и кеширующими системами.
POST - аналогичен методу GET, но не только запрашивает ресурс, но и передает ему некоторую информацию. Если ресурс - CGI скрипт, то информация поступает на его стандартный ввод. Метод GET тоже умеет передавать информацию для CGI скриптов, но передает он ее в самом имени ресурса. Дело в том, что если мы вызовем CGI скрипт таким образом:
script.cgi?ПАРАМЕТРЫ
то веб-сервер запустит на выполнение script.cgi, а тот в свою очередь сможет заполучить ПАРАМЕТРЫ. А вот о том, откуда он их получит, позже.
Кроме вышеперечисленных методов, существуют еще методы PUT - для сохранения данных в указанном ресурсе и DELETE - для удаления указанного ресурса. Как правило они не поддерживаются веб-серверами, сами понимаете почему.
Теперь пример запроса:
GET /~user/cgi-bin/test.pl HTTP/1.0
Это конечно самый простой пример. Обычно, запрос выглядит гораздо сложнее и состоит из нескольких строк. Чтобы веб-сервер знал, что ввод данных закончен, нужно послать ему пустую строку. Т.е в данном примере, нужно нажать Enter два раза (один раз - переход на новую строчку, второй раз - пустая строка).
Если вы запрашиваете главную страницу сайта (т.е. в браузере это www.perl.ru) запрос будет выглядеть так:
GET / HTTP/1.0
Практически все переданные данные можно узнать непосредственно в скрипте на перле. Для этого служит массив %ENV, в котором хранятся так называемые переменные среды CGI. Например:
$ENV{REQUEST_METHOD} = GET
$ENV{QUERY_STRING} = те самые
параметры (script.cgi?параметры)
Узнать все пременные очень просто:
foreach (keys %ENV){
print "$_ = $ENV{$_}\n";
}
Какую же еще информацию, мы можем передавать веб-серверу?
Поле | Пример | Описание |
Date: | Date: Sun, 30 Dec 2000 23:59:59 GMT | Дата запроса. |
MIME-version: | MIME-version: 1.0 | Версия MIME. |
Pragma: | Pragma: no-cache | Информация для шлюзов и прокси-серверов. |
Authorization: | Authorization: Basic QWxhZGRpbj pvcGVuIHNlc2FtZQ== | Информация для авторизации. |
From: | From: Pupkin@mail.ru | e-mail пользователя браузера. |
If-Modified-Since: | If-Modified-Since: Sun, 30 Dec 2000 23:59:59 GMT | Используется при методе GET. Документ возвращается только в том случае, если он изменился с указанного момента. Как правило браузер, запрашивает документ подобным образом, если копия документа содержится у него в кеше. И соответственно выдает пользователю информацию из кеша или обновленный документ. |
Referer: | Referer: http://www.perl.ru/ | URL предшествующего ресурса. Именно по нему на некоторых сайтах определяется, насколько хорошо их рекламирует тот или иной ресурс. |
User-Agent: | User-Agent: Mozilla/5.0 | Имя клиента. Может стоять что угодно, но некоторые, особенно гадкие сервера, не выдают страницы "не браузерам". |
Host: | Host: vasya.narod.ru | Имя хоста. Дело в том, что в сети существует очень большое количество виртуальных серверов, т.е. серверов с разными именами, но одним IP адресом. Именно по этой переменной веб-сервер определяет какую же информацию вам дать. |
Accept: | Accept: text/html | Указывает серверу, выдавать только данные указанного типа. |
Теперь пара примеров запросов:
GET /cgi-bin/test.cgi?name=Vasily&age=18 HTTP/1.0
User-Agent: Mozilla/5.0
И тоже, но методом POST
POST /~user/cgi-bin/test.cgi HTTP/1.0
User-Agent: Mozilla/5.0
Accept: text/html
Accept: image/gif
Content-Type: application/x-www-form-urlencoded
Content-Length: 18
name=Vasily
&age=18
Теперь рассмотрим, что же отвечает веб-сервер. Ответ веб-сервера выглядит следующим образом:
HTTP/ВЕРСИЯ КОД_ОТВЕТА ФРАЗА_ОТВЕТА
КОД_ОТВЕТА - 3-хзначное число. Указывает что все прошло успешно (200) или код ошибки.
ФРАЗА_ОТВЕТА - Тот же код но по-русски (шучу, по-английски)
Пример:
HTTP/1.1 200 OK
Дальше идет информация, которая различна для разных запросов. Как правило, это опять таки дата, тип сервера и т.д. Иногда веб-сервер может поместить в заголовок ответа следующую строчку:
Location: http://www.perl.ru/
Она указывает браузеру, что нужно немедленно идти по этому адресу, что собственно они все успешно и делают.
Далее я перечислю коды ответа браузера и их значения.
Обязательно должна присутствовать строчка:
Content-Type: text/html
указывающая тип переданных данных.
Ну и напоследок, список кодов возвращаемых веб-серверами и их значений
Код статуса | Значение |
200 | OK |
201 | Успешная команда POST |
202 | Запрос принят |
203 | Запрос GET или HEAD выполнен |
204 | Запрос выполнен но нет содержимого |
300 | Ресурс обнаружен в нескольких местах |
301 | Ресурс удален навсегда |
302 | Ресурс отсутствует временно |
304 | Ресурс был изменен |
400 | Плохой запрос от клиента |
401 | Неавторизованный запрос |
402 | Необходима оплата за ресурс |
403 | Доступ Запрещен |
404 | Ресурс не найден |
405 | Метод не применим для данного ресурса |
406 | Недопустимый тип ресурса |
410 | Ресурс Недоступен |
500 | Внутренняя ошибка сервера |
501 | Метод не выполнен |
502 | Неисправный шлюз либо перегруз сервера |
503 | Сервер недоступен/тайм-аут шлюза |
504 | Вторичный шлюз/тайм-аут сервера |
e-mail:
Copyright c 2001