HTTP (англ. Hyper Text Transfer Protocol – «протокол передачи гипертекста») — протокол передачи данных прикладного уровня, разработанный специально для обмена информацией между веб-сайтом и пользовательским агентом (браузером). Это один из тех стандартов, на которых основан весь World Wide Web. Взаимодействие поисковых систем с сайтами также проходит в рамках протокола HTTP.
Бессмысленно полностью и в деталях пересказывать здесь содержание RFC — ниже даны ссылки для подробного ознакомления. Здесь изложен только минимум, необходимый для понимания процесса обмена информацией в рамках протокола.
Многие термины могут пониматься в разных смыслах. Необходимо сразу договориться, в каком смысле употребляется в этой статье тот или другой термин.
Веб-сервер (сервер) — не компьютер, стоящий в датацентре, а исполняемая на этом компьютере программа, которая принимает запросы и отправляет запрошенные документы.
Пользовательский агент (клиент, User-agent) — программа, посылающая запросы веб-серверу и получающая от него документы. Это может быть ваш браузер, а может быть и сканирующий бот поисковой системы.
Документ — любая отдельная единица информации, имеющая свой адрес в домене. По умолчанию подразумевается HTML-страница, но документами также считаются файлы рисунков, CSS, Java-скриптов и т.п.
В HTTP предусмотрено всего два типа сообщений: запрос клиента и ответ сервера. Клиент шлет серверу запрос, указывая имя домена и адрес внутри домена, по которому должен находиться нужный документ. Сервер принимает сообщение, ищет документ (или запускает скрипт, которым этот документ генерируется) и при успешном завершении отправляет ответное сообщение.
Структура этих сообщений одинакова:
Стартовую строку и строки заголовков часто называют вместе «заголовком запроса» (или ответа).
Пример стартовой строки запроса:
GET /index.php HTTP/1.1
Передан метод запроса (GET), адрес документа внутри домена и версия протокола, которая используется.
Пример стартовой строки ответа:
HTTP/1.1 200 OK
Передана версия протокола, числовой код статуса (200) и расшифровка статуса (OK).
В заголовках запроса передается дополнительная информация, которая может влиять на дальнейший обмен сообщениями. Обязательно передается имя домена, из которого запрашивается документ. Также может передаваться ожидаемый медиатип документа, возможность приема в сжатом формате, ожидаемый язык для текстовых документов, название пользовательского агента, отправившего запрос. В заголовке могут также передаваться условия запроса. Например, If-Modified-Since: [метка времени] — запрашивается документ при условии, что его содержание изменилсь со времени, указанного в заголовке.
В заголовке ответа также передается дополнительная информация — название сервера, текущее время, медиатип и кодировка передаваемого документа, возможно и другие данные (язык для текстовых документов, дата модификации, размер в байтах и т.д.). Все это — сопроводительная информация к документу, который будет передан после заголовков (в теле сообщения), если запрос выполнен успешно.
При невозможности передачи документа код статуса в сообщении сервера соответствует характеру ошибки, а вместо тела документа передается специальная HTML-страница с текстом сообщения об ошибке. Обратите внимание, что статус ошибки не мешает браузеру отобразить эту страницу.
Протоколом в редакции RFC 2616 описано восемь методов для обращения к серверу. Но на сегодняшний день не все они реализованы для большинства веб-серверов, а обязательными к реализации признаны только два. Основные методы, которые нас интересуют и поддерживаются практически всеми веб-серверами — это GET, HEAD и POST.
Это самый обычный метод запроса для получения веб-страницы или другого документа. В ответ на этот запрос сервер должен отыскать (или сформировать) документ и при успешном завершении отправить его клиенту.
Формат запроса:
GET [URI] HTTP[версия протокола]
Тело сообщения в запросе отсутствует.
Этот метод аналогичен GET, но с одним отличием: в ответ на запрос HEAD сервер выполняет поиск (или формирование документа), но отправляет только заголовки ответа, не передавая тело сообщения. Таким способом можно проверить существование или доступность документа по данному адресу, получить всю информацию о документе, передаваемую в заголовках, не получая сам документ.
Формат запроса:
HEAD [URI] HTTP[версия протокола]
Тело сообщения в запросе отсутствует.
Этот метод предназначен для передачи данных на сервер — например, данные, введенные в форму, обычно передаются методом POST.
Формат запроса:
POST [URI] HTTP[версия протокола]
Поле [URI] содержит адрес скрипта-обработчика формы, который принимает и обрабатывает данные. В теле сообщения передаются данные, введенные в поля формы в виде [имя_поля=введенное_значение].
Коды статуса (состояния)1) отображают результат обработки запроса сервером. Код представлен трехзначным десятичным числом, старший разряд которого указывает на класс ответа. Таким образом, под каждый класс ответов зарезервировано до ста разных кодов статуса. Всего определено пять классов:
Коды от 100 до 199, входящие в этот класс, информируют клиента, что запрос получен. Сообщения с такими статусами содержат только стартовую строку и (если нужно) заголовки, но не содержат тело сообщения. Отправлять что-либо в ответ на это клиент не должен.
Сообщения этого класса означают, что запрос успешно получен, интерпретирован и обработан. Из этих кодов статуса нас интересует только 200 «OK» — признак нормального завершения, после которого в теле сообщения клиенту пересылается запрошенный документ.
C этим классом статусов сервер никогда не отправляет тело сообщения, поскольку они предписывают клиенту перенаправление запроса на другой адрес, т.е. выполнение повторного запроса. В этом классе статусов есть одно исключение: статус 304 Not Modified. Он используется в ответ на условные запросы и не вызывает перенаправления, а только сообщает о неизменном состоянии запрошенного документа.
В этом классе собраны ситуации, связанные с ошибочным запросом, который по каким-то причинам не может быть выполнен сервером. В число ошибок клиента входит неверный адрес документа, ограничение доступа к запрошенному адресу, ошибки в запросе.
Эта группа статусов отображает ошибки на стороне сервера, из-за которых корректный запрос клиента не может быть обработан.