Поля заголовка обеспечивают необходимую информацию о запросе, ответе или о переданном объекте. Существует четыре типа заголовка 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.