WebMaster/Programming/Perl/
Заголовки запросов и ответов.
Даже если вы и знаете кое-что о HTTP все равно не
лишне будет вспомнить о том как это все работает тем более на
эту информацию придется ориентироваться при написании CGI скриптов.
Этапы соедирения.
Первый этап это когда HTTP -клиент(браузер) соединяется с сервером.для
этого он использует протокол TCP/IP соединение происходит к известному
клиенту TCP-порту (80 -номер порта HTTP) (другие сервисы сидят
на других портах ,например FTP и SMTP на 21 и 25)
Вторым этапом идет запрос клиента:клиент передает заголовок запроса
и возможно(в зависимости от метода) тело сообщения запроса.В заголовке
обязательно указывается метод ,URI,и версия HTTP,и может быть
еще несколько необязательных полей
Третий этап -ответ сервера,который опять таки состоит из заголовка,в
котором сервер указывает версию HTTP и код статуса, который может
говорить о успешном или неуспешном результате и его причинах.Далее
идет тело ответа.
Четвертым этапом происходит разрыв TCP/IP соединения.
HTTP -запрос.
Запрос состоит из Строки запроса(она обязательна) и остальных
полей. Синтаксис строки :МЕТОД <SP> URI <SP> HTTP/версия
<CRLF>
где <SP> -пробел ,<CRLF> -переход на новую строку
Методы HTTP.
GET
Самый часто применяемый метод,в протоколе HTTP/0.9 был единственным
методом,и применяется для извлечения информации по заданому URI
Может быть условным если в заголовке указано поле If-Modified-Since:
HEAD
Почти идентичен GET но отличается тем что сервер не возвращает
тело обьекта а только его заголовок (метаинформацию) программы
могут применять его для проверки гиперссылок на правильность,доступность
и изменения.
POST
передает данные для обработки их программой ,указаной в URI сдесь
обязательно указывается поле Content-Length:
Сушествуют и другие ,реже применяемые методы,например
PUT -для сохранения передавемых данных в указаном URI и DELETE
для удаления ресурса.
Поля заголовка запроса.
После строки запроса идут поля заголовка запроса. Поля общего(general-header)
заголовка (он общий как для запросов так и для ответов):
Date:
Указывает дату запроса,например:
Date: Sun, 20 Nov 1994 08:12:31 GMT
MIME-version:
Указывает версию MIME (по умолчанию 1.0)
MIME-version: 1.0
Pragma:
Содержит указания для таких промежуточных агентов как прокси и
шлюзы,
Pragma: no-cache
Поля относящиеся к запросу(Request-Header):
Authorization:
Содержит информацию аутентификации
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
From:
Браузер может посылать адрес пользователя серверу
From: quake@doom.ru
If-Modified-Since:
используется при методе GET ресурс возвращается ,если он был изменен
с указаного момента, может использоваться при кешировании.
If-Modified-Since:Mon 15 Jul 1997 00:15:24 GMT
Referer:
Содержит URL предшествующего ресурса.
Referer: http://www.uic.nnov.ru/~paaa/index.html
User-Agent:
Програмное обеспечение клиента.
User-Agent: Mozilla/3.0
Заголовок информации сообщения (Entity-Header) применяется
как в запросах так и в ответах (при этом некоторые поля только
в ответах):
Allow: (в ответе сервера)
Список методов,поддерживаемых ресурсом.
Allow: GET, HEAD
Content-Encoding:
идентифицирует метод кодировки,которым был закодирован ресурс
Content-Encoding: x-gzip
Content-Length:
Длина тела сообщения
Content-Length: 102
Content-Type:
Содержит тип ресурса(MIME),для текстовых еще и кодировку символов(необязательно)
Content-Type: text/html; charset=windows-1251
Expires: (в ответе сервера)
Дата окончания действия ресурса,применяется в кешировании для
запрета кеширования устаревших ресурсов (в ответе)
Expires: Tue, 24 Sep 1998 23:00:15 GMT
Last-Modified: (в ответе сервера)
Время последнего обновления ресурса
Last-Modified: Tue, 23 sep 1998 13:48:40 GMT
Другие поля:
Поля Accept: указывают серверу выдавать только указаные форматы
данных,которые клиент может распознать.
Accept: text/html
Accept: text/plain
Accept: image/gif
Поле Host: служит для того , чтобы указать, к какому
хосту идет обращение. Данное поле не входит в число обязательных.
Однако оно является необходимым в тех случаях, когда одному физическому
серверу соответствует несколько виртуальных хостов. В этом поле
тогда указывается какой из виртуальных хостов имеется в виду.
Host: www.nnov.city.ru
Примеры запросов:
Простейший запрос:
GET /index.html HTTP/1.0
Посложнее:
GET /somedir/somedoc.html HTTP/1.0
User-Agent: Mozilla/2.0
Accept: text/html
Accept: text/plain
Accept: image/gif
Передача данных CGI- скрипту через метод GET
GET /~paaa/cgi-bin/test.cgi?name=Dmitry&organization=someorg&Name=&email=&comment=
HTTP/1.0
User-Agent: Mozila/2.0
Accept: text/html
Accept: image/gif
Используя метод POST данные передаются в теле сообщения
запроса:
POST /~paaa/cgi-bin/test.cgi HTTP/1.0
User-Agent: Mozila/2.0
Accept: text/html
Accept: image/gif
Content-Type: application/x-www-form-urlencoded
Content-Length: 131
name=Lesha
&organization=%D3%ED+%CD%E8%E6%ED%E5%E3%EE+%CD%EE%E2%E3%EE%F0%EE%E4%E0&Name=
&email=
&comment=
Ответ HTTP-сервера.
Ответ идет от сервера.Состоит он из строки состояния и затем поля
ответа Общий заголовок(General-Header) и заголовок тела сообщения
(Entity-Header),которые уже описаны при обсуждении запроса. и
еще идет заголовок ответа(Response-Header).
Строка состояния имеет следующий формат:
HTTP/version <SP> Status-Code <SP> Status-Phrase
где HTTP/version версия,Status-Code -3х значный код,и Status-Phrase
текстовая фраза, поясняющая код ,пример: HTTP/1.0 200 Ok
,200 -код означающий успешную обработку запроса,что и поясняет
"Ok" Заголовок ответа состоит из полей:
Location:
Содержит URI ресурса,может быть использован для переключения клиента
в другое место, если например ресурс был перемещен в другое место
или на другой сервер.
Location: http://www.uic.nnov.ru/newlocation/index.html
Server:
Информация о програмном обеспечении сервера
Server: Apache/1.1
WWW-Autenticate:
Параметры аутентификации.
WWW-Autenticate: Basic realm="doomsday"
Коды ответов HTTP.
Код статуса
Значение
200
OK
201
Успешная команда POST
202
Запрос принят
203
Запрос GET или HEAD выполнен
204
Запрос выполнен но нет содержимого
300
Ресурс обнаружен в нескольких местах
301
Ресурс удален навсегда
302
Ресурс отсутствует временно
304
Ресурс был изменен
400
Плохой запрос от клиента
401
Неавторизованый запрос