HTTP сервер или веб-сервер: назначение, функции и роль сервера в HTTP
Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжаем знакомиться с протоколом HTTP в рубрике Серверы и протоколы…
Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. В этой записи мы с тобой разберем, как отвечает HTTP сервер на запросы клиента. Как всегда: понятно и с примерами, но если тебе что-то будет непонятно — не стесняйся спросить в комментариях. Ответ ты получишь, как минимум, HTTP. Как ты уже догадался, в этой записи мы с тобой будем говорить про HTTP ответы сервера, а конкретнее: про строку состояния HTTP ответа сервера, немного поговорим про коды состояния HTTP ответа, посмотрим какие заголовки сервер может посылать в ответ на запрос и разберем несколько примеров HTTP ответа сервера.
HTTP ответы сервера: строка состояния HTTP ответа, коды состояния, заголовки HTTP ответа, примеры
Содержание статьи:
Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол. HTTP ответы – это HTTP сообщение, которое посылает сервер в ответ на запрос клиента. Ответы HTTP сервера строго регламентированы и имеют четкую структуру. Структура HTTP ответа сервера состоит из:
Для тех кому непонятно словесное описание структуры HTTP ответа сервера приведем пример:
[php]
Response = Status-Line ;
*( general-header ;
| response-header ;
| entity-header ) ;
CRLF
[ message-body ] ;
[/php]
Мы обозначили структуру HTTP ответа сервера. Давайте теперь рассмотрим каждую из составляющих HTTP ответа сервера в отдельности.
Первая строка в HTTP ответе – это строка состояния, иначе Status-Line. Она состоит из версии протокола HTTP, числового кода состояния HTTP сервера и поясняющей фразы. Окончание строки состояния в HTTP ответе является символ CRLF. Пример строки состояния HTTP ответа сервера:
[php] Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF [/php]
Вот таким нехитрым образом записывается строка состояния в HTTP ответ. Да, кстати, строка состояния — это параметр HTTP.
О кодах состояния HTTP ответа я планирую написать несколько отдельных публикаций с пояснениями и дополнениями, а вот в этой записи мы ограничимся лишь кратким обзором кодов состояний HTTP ответа, иначе статья была бы не полной.
Вообще, правильно говорить элемент кода состояния или Status-Code – это целочисленный трехразрядный код результата понимания и удовлетворения запроса клиента. Грубо говоря, это число, которое показывает то, как сервер понял запрос клиента. К коду состояния HTTP ответа идет поясняющая фраз, которая предназначена для людей, чтобы те понимали, что в итоге случилось. Давайте сведем в таблицу коды состояний HTTP сервера и дадим к ним пояснения:
Номер | Код состояния HTTP сервера и его описание |
1 | 1xx: информационный код состояния HTTP сервера Все коды состояний, начинающиеся с единицы говорят клиенту о том, что их запрос получен и находится в обработке и называются они — информационные коды состояния. |
2 | 2xx: успешный код состояния HTTP сервера Все коды состояний, начинающиеся с двойки говорят клиенту о том, что действие закончилось успешно: получено, понято и обработано, такие коды называются успешные HTTP коды. |
3 | 3xx: код перенаправления HTTP сервера Все коды состояния, начинающиеся с тройки говорят клиенту о том, что для продолжения работы ему нужно совершить какие-то действия, это коды получили название кодов перенаправления HTTP сервера. |
4 | 4xx: коды ошибок HTTP клиента Все коды состояния, начинающиеся с четверки говорят нам о том, что ошибка происходит по вине клиента (неверный синтаксис, устаревший протокол и прочее), из-за чего сервер не может корректно отработать и дать ответ. Их называют коды ошибок HTTP клиента. |
5 | 5xx: коды ошибок HTTP сервера Все коды состояний, начинающиеся с пятерки, говорят нам о том, что произошла ошибка на стороне сервера HTTP. И они получили называние коды ошибок HTTP сервера. |
Приведем набор кодов состояний в HTTP и поясняющие фразы к ним:
[php]
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 Timeout
| «409» ; Конфликт, Conflict
| «410» ; Удален, Gone
| «411» ; Требуется длина, Length Required
| «412» ; Предусловие неверно,
; Precondition Failed
| «413» ; Объект запроса слишком большой,
; Request Entity Too Large
| «414» ; URI запроса слишком длинный,
; Request-URI Too Long
| «415» ; Неподдерживаемый медиа тип,
; Unsupported Media Type
| «500» ; Внутренняя ошибка сервера,
; Internal Server Error
| «501» ; Не реализовано, Not Implemented
| «502» ; Ошибка шлюза, Bad Gateway
| «503» ; Сервис недоступен, Service
; Unavailable
| «504» ; Истекло время ожидания от шлюза,
; Gateway Timeout
| «505» ; Не поддерживаемая версия HTTP,
; HTTP Version Not Supported
| extension-code
extension-code = 3DIGIT
Reason-Phrase = *<TEXT не включающий CR, LF>
[/php]
Хочу обратить ваше внимание на то, что поясняющая фраза является рекомендацией стандарта HTTP и может быть заменена сервером на свою. Так же стоит заметить, что коды состояний HTTP ответа расширяемы и клиенту не обязательно понимать значения всех кодов состояний, однако каждый клиент должен понимать класс кода состояний, который обозначен первой цифрой.
Поля заголовка HTTP ответа необходимы серверу для того, чтобы передать дополнительную информацию клиенту, которая не может быть помещена в строку состояния. Поля заголовка HTTP ответа помогают клиенту правильно обработать HTTP сообщение сервера. Так же поля заголовка HTTP ответа могут содержать дополнительную информацию о сервере и о дальнейшем доступе к ресурсу, указанному в URI (URI в HTTP):
[php]
response-header = Age ;
| Location ;
| Proxy-Authenticate ;
| Public ;
| Retry-After ;
| Server ;
| Vary ;
| Warning ;
| WWW-Authenticate ;
[/php]
Если вы собрались написать свой HTTP сервер, то без проблем сможете расширить поля заголовка HTTP ответов, это не рекомендуется стандартом, но все же делается и, в принципе, клиенты понимают такое расширение и корректно его отрабатывают. Тут главное соблюдать HTTP требования.
Давайте теперь посмотрим пример HTTP ответа сервера, помните, мы запрашивали у сервера HTML документ в записи про HTTP запросы? Давайте теперь посмотрим, какой ответ нам даст HTTP сервер:
[php]
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
[/php]
А теперь давайте посмотрим, какой ответ нам даст HTTP сервер, если произойдет ошибка и сервер не сможет найти требуемую нам страницу:
[php]
HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC «-//IETF//DTD HTML 2.0//EN»>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>The requested URL /t.html was not found on this server.</p>
</body>
</html>
[/php]
И третий пример покажет нам, что ответит HTTP сервер, если обнаружит, что клиент пользуется другой версией HTTP протокола:
[php]
HTTP/1.1 400 Bad Request
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Content-Type: text/html; charset=iso-8859-1
Connection: Closed
<!DOCTYPE HTML PUBLIC «-//IETF//DTD HTML 2.0//EN»>
<html>
<head>
<title>400 Bad Request</title>
</head>
<body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.</p>
<p>The request line contained invalid characters following the protocol string.</p>
</body>
</html>
[/php]
Вот так легко и просто мы разобрались с HTTP ответами сервера.
Спасибо за полное разъяснения кодов состояний ответ сервера и за полный список кодов в HTTP ответах, этой страничкой, как справочником пользоваться буду: очень удобно, когда всё в одном месте!
Вы писали про символ CRLF, что это такое, я понимаю, что вопрос не про HTTP ответы, так всё понятно, кроме этого преславутого CRLF.
Символ CRLF — свдивунть каретку перетянуть бумагу, что-то вроде этого, этот символ идет со времен мейнфреймов и означает перевод на новую строку. В сообщениях HTTP, не важно, запрос то или ответ, данный символ означает окончание строки. Если строка содержит только символ CRLF, то это означает окончание блока.
Кирилл, спасибо, как всегда — отлично, ясно и доступно! 🙂 Только вот не понятно какие значения могут быть в полях заголовка? Все ваши публикации пересмотрела и про сообщения и про ответа, и даже про запросы, дошла до самых первых статей в рубрике HTTP, но ответа не нашла 🙁
Про поля заголовков в HTTP сообщениях будет отдельная публикация, надеюсь, что скоро!