Руководство по HTTP. Поля заголовка.

Поля заголовка обеспечивают необходимую информацию о запросе, ответе или о переданном объекте. Существует четыре типа заголовка HTTP сообщения:

  • Общий заголовок
    Применяется для как для запроса, так и для ответа.
  • Заголовок запроса клиента
    Применяется только для запроса.
  • Заголовок ответа сервера
    Применяется только для ответа.
  • Заголовок сущности
    Определяет метаданные сущности. Если сущности нет, то метаданные URI запроса.

Общие заголовки

Cache-Control
Данное поле заголовка определяет директивы, которые должны быть выполнены системой кэширования. Этот заголовок имеет следующий вид:


Cache-Control: директива-кэш-запроса | директива-кэш-ответа

Сервер или клиент могут использовать данный заголовок кэширования или запроса документов из кэша.
Пример:


Cache-control: no-store

В таблице ниже приведен список наиболее важных директив, которые могут быть использованы HTTP клиентом в запросах:

Директива кэш-запроса и описание
1 no-cache

Кэш не должен использовать запрос для удовлетворения под-запроса, без успешной повторной валидации сервером.

2 no-storeКэш не должен хранить ничего о запросе клиента или ответе сервера.
3 max-age = seconds Акцентирует внимание на том, что клиент должен принимать ответ, возраст которого не более, чем время, указанное в секундах.
4 max-stale [= seconds]Акцентирует внимание на том, что клиент должен принимать ответ, который превышает время истечения. Если даны секунда, то время истечения не должно превышать указанного времени.
5 min-fresh = seconds

Акцентирует внимание на том, что клиент должен принимать ответ, время обновления которого не менее, чем текущий возраст, плюс время, указанное в секундах.

6 no-transformНе преобразует сущности.
7 only-if-cachedНе получает новые данные. Кэш может отправлять документ только в том случае, если он находится в кэше. И не должен связываться с сервером для получения более новых существующих копий.

Ниже приведены наиболее важные директивы ответа кэша, которые могут быть использованы сервером в HTTP ответе:

Кэш запроса и описание
1 public

Указывает, что ответ может быть кэширован любым кэшем.

2 private Указывает, что весь или часть ответа предназначены одному пользователю и не должны быть кэшированы общим кэшем.
3 no-cacheКэш не должен использовать ответы для удовлетворения последующих запросов без успешной повторной валидации сервером.
4 no-storeКэш не должен хранить информацию о запросе клиента или ответе сервера.
5 no-transformНе преобразует сущность.
6 must-revalidate

Кэш должен подтвердить статус валидности документа перед использованием и не должен использовать те, время валидности которых истекло.

7 proxy-revalidateТо же самое, как и must-revalidate, за исключением того, что данная директива не принимает, не общие кэши пользователя.
8 max-age = seconds Акцентирует внимание на том, что клиент должен принимать запросы, возраст которых не более указанного в секундах.
9 s-maxage = seconds Максимальный возраст, определённый данной директива переопределяет максимальный возраст определённый директивой max-age или заголовком Expires. Всегда игнорируется приватным кэшем.

Connection

Данное поле заголовка позволяет отправителю определить желаемые свойства для данного конкретного соединения и не должно связываться с прокси через текущее соединение.

Данное поле заголовка имеет следующий вид:


Connection: "Соединение"

Версия HTTP 1.1 определяет свойство соединения “close” для отправителя, для того, чтобы указать, что соединение будет закрыто после выполнения ответа.
Например:


Connection: close

По умолчанию, HTTP/1.1 использует персистентные соединения, в которых соединение не закрывается автоматически после выполнения транзакции. HTTP/1.0 не имеет персистентного соединения по умолчанию и, если мы хотим его использовать, то нам необходимо использовать параметр keep-alive.
Пример:


Connection: keep-alive

Дата
При работе с HTTP, время и дата должны быть представлены во времени по Гринвичу (Greenwich Mean Time – GMT) во всех случаях без исключений.

При работе с HTTP приложениями допускается использование одного из следующих трёх форматов:


Tue, 24 May 2016 15:15:15 GMT   ;
Tuesday, 24-May-16 15:15:15 GMT ;
Tue May  24 15:15:15 2016       ;

Наиболее часто встречается первый формат.

Pragma

Данное поле используется для внедрения имплементации специальных директив, которые могут быть приняты любым реципиентом в цепочке запрос/ответ.

Например:


Pragma: no-cache

Директива no-cache является единственной, директивой, которую поддерживает версия HTTP/1.0. Для обратной совместимости, она поддерживается и HTTP/1.1. В будущем создание новых директив Pragma не планируется.

Trailer
Это поле указывает, что данный набор заголовков представлен в виде последовательности сообщений, которые закодированы с помощью фрагментации кодировки передачи.
Например:


Trailer: имя-поля

Сообщения данного заголовка не должны включать следующие поля:

  • Trailer
  • Content-Length
  • Transfer-Encoding

Transfer-Encoding

Данное поле указывает, какой тип преобразования был применён к телу сообщения. Используется для безопасного обмена данными между клиентом и сервером.

Пример:


Transfer-Encoding: chunked

Upgrade
Данное поле позволяет клиенту определять дополнительные протоколы обмена данными, которые он поддерживает и хотел бы использовать в случае, если он поддерживается сервером.
Пример:


Upgrade: HTTP/1.1, SHTTP/1.2, RTA/x11

Via
Это поле используется соединениями и прокси для указывания промежуточных протоколов и адресатов. Если данные идут не напрямую, а через прокси.
Например:


Via: 1.2 some_proxy, 1.1 website.com (Apache/1.1)

Warning
Данное поле используется для хранения дополнительной информации о статусе или преобразовании данных, которые могут не отображаться в самом сообщении.
Заголовок имеет следующий вид:


Warning: код-предупреждения (пробел) агент-предупржедения (пробел) текст-предупреждения (пробел) дата-предупреждения

Заголовки запросов клиента

Accept

Используется для определения определённых типов медиа файлов, которые применимы для ответа.

Общий вид:


Accept: тип/подтип [q = qvalue]

Если мы хотим использовать несколько типов данных, то нам необходимо отделить их запятыми и добавить не обязательное значение qvalue (уровень качества) от 0 до 1.
Например:


Accept: text/plain; q=0.8, text/html; q=0.9, text/x-c

Т.е. наиболее предпочтительными являются типы text/x-c, но, если он не существуют, то text/html, а если нет его – text/plain.

Accept-Charset
Указывает, какой набор символов приемлем для ответа.
Пример:


Accept-Charset: iso-8859-7, unicode-1-1; q=0.7

Accept-Encoding
Указывает приемлемую для ответа кодировку контента
Пример:


Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.6, gzip;q=0.9
Accept-Encoding: gzip;q=0.9, identity; q=0.6, *;q=0

Accept-Language
Указывает набор приемлемых языков для ответа.
Пример:


Accept-Language: ru, en-us;q=0.6, en;q=0.8

Authorization
Содержит данные аутентификации пользователя для запрашиваемого ресурса.
Содержит имя_пользователя:пароль, закодированные базовой 64-битной кодировкой
Пример:


Authorization: BASIC K4Kma4Y1A3Hqn1LsNuO=

Cookie
Содержит пару “имя-значение” информации, хранящейся по данной URL.
Пример:


Cookie: имя1=значение1;имя2=значение2;имя3=значение3

Expect
Указывает, что данный набор поведений сервера требуется клиентом.
Пример:


Expect : 100-continue | ожидаемое-расширение

From
Данное поле содержит email пользователя, который контролирует запросы пользователя
Пример:


From: proselytear@yahoo.com

Host
Определяет хост и порт запрашиваемого ресурса.
Пример:


GET /pub/WWW/ HTTP/1.1
Host: www.proselyte.net

If-Match
Данное поле используется для того, чтобы сделать метод условным. Если мы хотим, чтобы метод выполнялся, только при соблюдении определённого условия.
Пример:


If-Match: "abcd"
If-Match: "aabcd", "avfgwfw", "wfwgp"
If-Match: *

В данном случае, если не выполнится ни одно из условий, то сервер не выполнит запрашиваемый метод и вернёт код статуса 412.
If-Modified-Since

Используется для создания условий. Если запрашиваемая URL не была изменена с указанного времени, сущность будет возвращена сервером вместо ответа 304 (Not modified) без сообщения в теле.
Пример:


If-Modified-Since: Mon, 23 May 2016 16:37:12 GMT

If-None_Match
Используется для того, чтобы сделать метод условным. Выполняется только в том случае, если одно из переданных значений совпадает с тэгом, представленным ETag.
Пример:


If-None-Match: "abcdefg"

If-Range
Данное поле может быть использовано с условным GET для запроса определённой части данных.
Пример:


If-Range: Mon, 23 May 2016 16:37:12 GMT

Если документ не был изменён с указанной даты, то сервер вернёт диапазон байтов, переданный заголовком Range.
If-Unmodified-Since
Данный заголовок делает метод условным.
Пример:


If-Unmodified-Since: Mon, 23 May 2016 16:37:12 GMT

Если запрашиваемый ресурс не был изменён с указанного времени, сервер должен выполнить запрашиваемые действия.

Max-Forwards
Этот заголовок обеспечивает механизм с методами TRACE и OPTIONS для ограничения количества прокси или соединений, которые могут передавать запрос следующему серверу.
Пример:


Max-Forwards : 10

В данном случае максимальное количество прокси и соединений – 10.

Proxy-Authorization
Данный заголовок позволяет клиенту определять себя (или своего пользователя) для прокси, который требует аутентификации.
Пример:


Proxy-Authorization : имя_пользователя_и_пароль

Range
Поле заголовка Range определяет диапазон запрашиваемого из документа контента в байтах.
Пример:


- Только первые 100 байтов
Range: bytes=0-999

Несколько диапазонов байтов указываются через запятую.

Referer
Данное поле заголовка позволяет клиенту определять URI ресурса с которого пришёл запрос на URL.
Пример:


Referer: http://www.proselyte.net/tutorials/http-tutorial.html

TE
Поле заголовка TE указывает расширение кодировка передачи, которая должна быть принята запросом или не должна.
Пример:


TE: deflate
TE:
TE: trailers, deflate;q=0.9

Означает, что клиент должен принимать поля trailer и фрагментированную кодировку передачи.

User-Agent
Данное поле заголовка содержит информацию об агенте пользователя, посылающего запрос.
Пример:


User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

Заголовки ответа сервера

Accept-Ranges
Позволяет серверу указывать принятие им диапазона запросов.
Пример:


Accept-Ranges: bytes

Сервер принимает запросы диапазонов байтов.

Age
Передаёт ожидания относительно времени (в секундах), прошедшего с момента ответа, который был сгенерирован сервером.
Пример:


Age: 900

Указывает, что ожидаемое время – 900 секунд (15 минут).

ETag
Поле заголовка ETag обеспечивает текущее значение тэга сущности для варианта, на который был сделан запрос.
Пример:


ETag: "abcdef"

Location
Используется для перенаправления реципиента на URL, отличную от запрашиваемой.
Пример:


Location: http://www.proselyte.net/http-tutoiral.html

Proxy-Authenticate
Данное поле заголовка должно быть включено как часть ответа 407 (Proxy Authentification Required).
Пример:


Proxy-Authenticate  : информация

Retry-After
Может быть использовано вместе с ответом 503 (Service Unavailable), чтобы указать, как долго сервис будет недоступен для запросов.
Пример:
Запрос после определённой даты


Retry-After: Sun, 29 May 2016 23:59:59 GMT

Запрос после определённого промежутка времени в секундах (в примере, через 600 секунд)


Retry-After: 600

Server
Содержит информацию о ПО, которое используется сервером, обрабатывающем запрос.
Пример:


Server: Apache/2.2.14 (Win32)

Set-Cookie
Содержит пары значений “имя/значение”, информации по этой URL.
Вот возможные значения, которые мы можем настроить:

Настройка и описание
1 Comment=comment

Для определения любого комментария, связанного с cookie.

2 Domain=domain

Определяет домен, для которого cookie валидны.

3 Expires=Date-time

Дата, после которого cookie не действительны. Если пусто, то истекают сразу

после закрытия браузера клиентом

4 Path=path

Определяет подмножество URL, к которым применимы cookie.

5 Secure

Даёт указанию агенту пользователя возвращать cookie только под защищённым

соединением

Пример:


Set-Cookie: имя1=значение1,имя2=значение2; Expires=Sun, 29 May 2016 23:59:59 GMT

Vary
Определяет, что сущность имеет несколько ресурсов, которые могут варьироваться в зависимости от определённого списка заголовков запроса.

Пример:


Vary: Accept-Encoding, Accept-Language

WWW-Authenticate
Должен быть включён в ответ 401 (Unauthorized).
Пример:


WWW-Authenticate: BASIC realm="administrator"

Заголовки сущности

Allow
Содержит список методов, которые поддерживаются ресурсом, определяемом URL.
Пример:


Allow: GET, HEAD, PUT, POST

Content-Encoding
Используется как модификатор для типа медиа файлов.
Пример:


Content-Encoding: zip

Если кодировка контента, запрашиваемая клиентом не поддерживается сервером, то будет получен ответ 415 (Unsupported Media Type).

Content-Language
Определяет языки для определённой сущности.
Если мы хотим использовать несколько языков, то мы должны указать их символы через запятую.
Пример:


Content-Language: ru, en

Content-Length
Данное поле заголовка указывает размер тела сущности десятичным числом (символы).
Пример:


Content-Length: 5000

Content-Location
Используется для поддержки локации ресурса для сущности, помещённой в сообщение, когда сущность запрашивается из локации, отличной от URI запрашиваемого ресурса.

Пример:


Content-Location: http://www.proselyte.net/http-tutorial.html

Content-MD5
Данный заголовок используется для поддержки MD5 для сущности.
Пример:


Content-MD5  : e0dd3b3c2d46826455f917a8e1f3f5a3

Content-Range
Данное поле заголовка отсылается с частью сущности для того, чтобы указать, где именно в целой сущности должна размещаться часть.
Пример:
Предположим, размер сущности 2000 байтов


- Первые 800 байтов:
Content-Range : bytes 0-799/2000

- Вторые 800 байтов:
Content-Range : bytes 800-1599/2000

- Всё, кроме первых 800 байтов:
Content-Range : bytes 800-1999/2000

- Крайние 800 байтов:
Content-Range : bytes 1200-1999/2000

Когда HTTP сообщение содержит контент с одним диапазоном, то оно передаётся с заголовками Content-Range и Content-Length, для того, чтобы показать количество уже переданных байтов.
Например:


HTTP/1.1 206 Partial content
Date: Mon, 23 May 2016 19:12:49 GMT
Last-Modified: Sun, 22 May 2016 22:39:11 GMT
Content-Range: bytes 31000-57019/57020
Content-Length: 26020
Content-Type: image/jpg

Content-Type
Данное поле заголовка указывает тип медиа файла тело сообщения, переданного реципиенту.
Пример:


Content-Type: text/html; charset=ISO-8859-5

Expires
Указывает дату и время, после которого ответ считается устаревшим.
Пример:


Expires: Sun, 29 May 2016 23:59:59 GMT

Last-Modified
Данное поле заголовка указывает дату и время, когда (по мнению сервера) был крайний раз изменён файл.
Пример:


Last-Modified: Sun, 29 May 2016 23:59:59 GMT

На этом мы заканчиваем изучение полей заголовка.
В следующей статье мы рассмотрим кэширование в HTTP.