Что такое протокол HTTP и для чего он нужен, я думаю расказывать не нужно, поэтому сразу приступим к более подробному рассмотрению. Какое отношение HTTP протокол имеет к Perl? Да самое прямое. Без знания HTTP протокола, нельзя написать практически никакого CGI скрипта.
Итак, договоримся о терминах.
Веб-сервер - програмное обеспечение, которое следит за 80 (возможны и другие варианты, но данный наиболее популярен) портом и в случае обнаружения запроса, выдает некоторую информацию (сообщение об ошибке, html документ).
Клиент - программное обеспечение осуществляющее подключение к 80 порту сервера и посылающее туда запрос.
Помимо выдачи статичных документов, веб-серверы умеют выдавать результаты работы скрипта. т.е. если клиент запрашивает документ, который на самом деле является CGI скриптом, то веб-сервер запускает этот скрипт на выполнение, а всю информацию полученную со стандартного выхода скрипта, перенаправляет клиенту.
В процессе прочтения данного документа, вам наверно захочется попробовать все предложенные примеры. Используйте для этого любой telnet клиент. Просто соединитесь с 80 портом сервера, на котором расположен ваш любимый сайт.
Взаимодействие, между веб-сервером и клиентом просто до неприличия. Клиент посылает запрос состоящий из заголовка и (иногда) тела, а веб-сервер выдает ответ, который так же состоит из заголовка и тела. Рассмотрим более детально, как же выглядят эти запросы и ответы.
Любой запрос начинается строкой:
МЕТОД РЕСУРС HTTP/версия
МЕТОД - один из поддерживаемых веб-сервером методов. Наиболее распространены:
GET - в этом случае выдается запрошенный ресурс. Самый старый и самый распространенный метод.
HEAD - в этом случае, выдается только заголовок документа. Из заголовка можно узнать существует ли документ, его размер и еще некоторую информацию, о которой ниже. Данный метод, как правило, используется для проверки ссылок и кеширующими системами.
POST - аналогичен методу GET, но не только запрашивает ресурс, но и передает ему некоторую информацию. Если ресурс - CGI скрипт, то информация поступает на его стандартный ввод. Метод GET тоже умеет передавать информацию для CGI скриптов, но передает он ее в самом имени ресурса. Дело в том, что если мы вызовем CGI скрипт таким образом:
script.cgi?ПАРАМЕТРЫ
| Поле | Пример | Описание |
| 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 | Указывает серверу, выдавать только данные указанного типа. |
| Код статуса | Значение |
| 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 | Вторичный шлюз/тайм-аут сервера |