Подробное объяснение малоизвестных полей заголовка HTTP-протокола "оригинал"

задняя часть сервер HTTP браузер
Подробное объяснение малоизвестных полей заголовка HTTP-протокола "оригинал"

В продолжение предыдущегоОсновы протокола HTTPПосле этого в этой статье основное внимание будет уделено обычно используемому заголовку HTTP.

Существует так много заголовков HTTP, и мало кто может полностью понять, для чего эти заголовки. Ввиду сложности и неясности спецификации файла RFC в этой статье разбирается заголовок HTTP, указанный в спецификации протокола, и выражается на простом языке, чтобы читатели могли полностью понять протокол HTTP.

Автор обнаружил много знаний, которые не были замечены ранее при чтении документа RFC.По оценкам, большинство веб-разработчиков проигнорировали эти знания.Чтение текста принесет вам много неожиданных сюрпризов.

Отказ от ответственности: если с приведенным ниже предложением что-то не так, пожалуйста, меньше брызгайте слюной.

Accept

Указывает формат мультимедиа, который клиент ожидает от сервера. Тип ресурса, ожидаемый клиентом, может быть недоступен на сервере, поэтому клиент ожидает несколько типов и устанавливает приоритет, а сервер находит соответствующий ресурс и возвращает его клиенту в соответствии с приоритетом.

# 注意:先逗号分割类型,再分号分割属性
Accept: audio/*; q=0.2, audio/basic

Указывает, что предпочтительными являются ресурсы аудио/базового типа. В противном случае можно использовать аудиоресурсы любого другого формата. Диапазон значений q составляет (0-1), и его конкретное значение не имеет смысла. Оно используется только для сортировки приоритета. Если q отсутствует, по умолчанию q=1, что является наивысшим приоритетом.

Accept-Charset

Представляет формат кодировки того, что клиент ожидает от сервера. Как и заголовок Accept, он также может указывать несколько кодировок, а значение q представляет приоритет.

# 注意:先逗号分割类型,再分号分割属性
Accept-Charset: utf8, gbk; q=0.6

Указывает, что кодировка utf8 предпочтительна, если нет, возврат с кодировкой gbk.

Content-Type

Content-Type — это заголовок, отправляемый сервером клиенту, представляющий тип мультимедиа и формат кодирования содержимого, а также унифицированный ответ на заголовок Accept и заголовок Accept-Charset.

Content-Type: text/html; charset=utf8

Указывает, что возвращенное тело представляет собой текст html, закодированный как utf8.

Accept-Language

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

Accept-Language:zh-CN,en-US;q=0.8,zh-TW;q=0.6

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

Content-Language

Содержимое этого поля заголовка является ответом на Accept-Language. Через это поле сервер сообщает клиенту, на каком языке возвращается информация о теле.

Content-Length

Указывает длину тела передаваемого запроса/ответа. Запросы GET не нуждаются в этом заголовке, потому что у них нет тела. Запрос/ответ, который содержит тело и может заранее знать длину тела, должен содержать это поле, чтобы другая сторона могла легко различить границу сообщения, то есть, когда данные тела заканчиваются. Если Body слишком велико, его необходимо рассчитать и передать одновременно.Размер всего Body не может быть известен до конца расчета.В это время можно использовать HTTP-передачу блока, а Content- Поле длины в настоящее время не требуется.

Content-Location

Когда ресурс, запрошенный клиентом, имеет несколько адресов на сервере, сервер может сообщить клиенту о других необязательных адресах через поле Content-Location. Это поле встречается относительно редко.

Content-MD5

Эта информация предоставляется в заголовке для проверки содержимого тела. Он представляет собой строку base64 после обработки информации Body алгоритмом md5. Это поле также относительно редкое. Поскольку механизм проверки был реализован на уровне TCP, не имеет особого смысла иметь еще один уровень проверки. Кроме того, значение ресурса md5 часто используется в качестве уникального идентификатора ресурса в следующей информации заголовка ETag.

Date

Если сервер не кэшируется, Дата — это момент, когда был сгенерирован ответ. Если на сервере есть кеш, Date — это время кэширования содержимого ответа. Он должен соответствовать определенному формату, определенному в спецификации, который называется HTTP-Date, и не поддерживает произвольное определение вашего собственного формата времени.

Date: Tue, 15 Nov 1994 08:12:31 GMT

Age

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

Age: 86400

Expires

Сервер использует заголовок Expect, чтобы сообщить другой стороне, когда срок действия ресурса истек. Если его значение равно значению заголовка Date, это означает, что ресурс доступен.

Expires: Thu, 01 Dec 1994 16:00:00 GMT

ETag

Теги ресурсов, каждый ресурс может предоставлять информацию о нескольких тегах. Обычно он используется в сочетании со следующими параметрами If-Match и If-None-Match для определения достоверности кэшированных ресурсов. Более распространенной меткой является номер версии ресурса, например, в качестве номера версии можно использовать проверочный код md5 данных ресурса.

If-Match

Значением If-Match обычно является значение упомянутого выше ETag, которое часто используется для оптимистичной блокировки в HTTP. Так называемая оптимистическая блокировка HTTP означает, что клиент сначала получает ресурс, чтобы получить номер версии в ETag, а затем инициирует запрос модификации ресурса PUT|PATCH, чтобы указать номер версии ресурса через заголовок If-Match. ресурс сервера удовлетворяет условиям If-Match Указанный номер версии, запрос будет выполнен. Если оно не выполняется, это означает, что ресурс был изменен одновременно, и вам нужно вернуть ошибку с кодом состояния 412 Precondition failed. Клиент может отказаться или повторить весь процесс.

If-None-Match

Аналогичен If-Match, но с противоположным условием.

Allow

Указывает тип метода HTTP, к которому ресурс поддерживает доступ. Это предложение сервера клиенту, говорящее другой стороне использовать метод, указанный в разделе «Разрешить доступ к ресурсу».

Allow: GET, HEAD, PUT

Connection

Заголовок Connection можно использовать, когда клиенту и серверу необходимо согласовать свойства соединения. Чаще используется значение close, которое используется для уведомления другой стороны о необходимости закрыть соединение после завершения текущего запроса.

Connection: close

Expect

Используется для запроса разрешения у сервера перед отправкой запроса. Например, если вы хотите отправить на сервер большой файл и не уверены, превышает ли он лимит, вы можете добавить заголовок Expect в заголовок запроса.

Expect: 100-continue

Если сервер скажет «нет», он вернет ошибку 417 Expectation Failed, говорящую клиенту сдаться. Если это возможно, верните код состояния 100 continue, чтобы сообщить клиенту о том, чтобы он отпустил его, чтобы клиент продолжал загружать содержимое тела. Если сервер заранее получит содержимое Body, он сдастся и вернет ответ 100 continue.

From

Это поле обычно используется для обозначения адреса электронной почты инициатора запроса, что эквивалентно назначению ответственного за запрос. Если сервер обнаружит, что с запросом возникла проблема, он свяжется с инициатором через это поле для обработки. Поскольку адрес электронной почты включает личную информацию, требуется согласие пользователя, чтобы запрос содержал заголовок From. Протокол RFC рекомендует, чтобы все запросы, инициированные агентом робота, содержали этот заголовок, чтобы можно было найти ответственное лицо при возникновении проблем. Однако, если это злонамеренный робот, предполагается, что такое предположение останется глухим.

Host

Протокол RFC предусматривает, что все HTTP-запросы должны содержать заголовок узла.Даже если узел не имеет значения, к заголовку узла должна быть прикреплена пустая строка.Если он не удовлетворен, сервер приложений должен выдать 400 Bad Request. Хоть протокол и прописан именно так, но большинство шлюзов или серверов более благосклонны, так как поле Host не указано, оно будет добавлено у вас по умолчанию. Агент шлюза может переадресовывать на разные вышестоящие сервисные узлы в соответствии с разными значениями хоста, и он часто используется для бизнеса по обслуживанию виртуального хоста.

Last-Modified

Отмечает время последнего изменения ресурса.Похоже на Date, за исключением того, что Last-Modified представляет время изменения, а Date — время создания.

If-Modified-Since

Когда браузер запрашивает статический ресурс с сервера, если браузер уже имеет локальный кеш, он будет нести заголовок If-Modified-Since со значением времени Last-Modified ресурса и запрашивать у сервера, является ли ресурс существует с момента последнего изменения. Если он не был изменен, он вернет браузеру 304 Not Modified, чтобы сообщить браузеру, что он может безопасно использовать ресурсы в кеше. Если ресурс был изменен, как и при обычном запросе GET, содержимое ресурса вернет 200 OK.

If-Unmodified-Since

Подобно If-Modified-Since, значение противоположно. Разница в том, что когда условия ресурса сервера не выполняются, вместо возврата 304 Not Modified он возвращает 412 Precondition Failed.

Range

Серверы, поддерживающие возобновление, ДОЛЖНЫ обрабатывать заголовок Range, который представляет запрошенный диапазон байтов, указанный клиентом при запросе части ресурса. Это заголовок запроса, отправляемый клиентом на сервер.

Range: bytes=500-999

Content-Range

Для приведенного выше заголовка Range сервер также должен предоставить соответствующий заголовок Content-Range при ответе клиенту, указывающий диапазон байтов передаваемых данных Body в общем блоке ресурсов. Например, в следующем примере показано, что общий размер ресурса составляет 47022 байта, а содержимое текущего ответа находится в диапазоне от 21010 до 47021 байт.

Content-Range: bytes 21010-47021/47022

Причина, по которой это 47021, а не 47022, заключается в том, что смещение начинается с 0, а 47021 — это последний байт.

If-Range

При возобновлении загрузки с точки останова, чтобы гарантировать, что сам ресурс сервера не изменится между двумя последовательными запросами, номер версии ресурса ETag должен быть включен в заголовок If-Range. Ресурс сервера использует этот номер версии, чтобы определить, изменился ли ресурс. Если он не изменился, верните 206 Partial Content, чтобы вернуть некоторые ресурсы. Если ресурс изменяется, это эквивалентно обычному запросу GET, возвращающему 200 OK и все содержимое ресурса.

Location

Когда сервер отправляет клиенту перенаправление 302, он всегда содержит заголовок Location, и его значением является целевой URL-адрес.

HTTP/1.1 302 Temporary Redirect
Location: https://www-temp.example.org/

Max-Forwards

Используется для ограничения количества уровней шлюзов или прокси, то есть максимального количества раз переадресации. Каждый раз, когда HTTP проходит через уровень шлюза или прокси, значение Max-Forwards уменьшается на 1. Если Max-Forwards уже равен 0, когда nginx получает запрос от внешнего интерфейса, то он не должен пересылать запрос на сервисный узел, указанный вышестоящим.

Pragma

Этот заголовок относительно распространен и часто добавляется в режиме разработки внешнего интерфейса.

Pragma: no-cache

Когда шлюз получает заголовок с таким запросом, даже если есть кеш запрошенного ресурса и он валиден, он не может быть отправлен напрямую клиенту, а должен быть перенаправлен нижестоящему вышестоящему для обработки. Однако, если все шлюзы действительно следуют этому протоколу, атаку очень легко организовать, поэтому она обычно используется только в режиме разработки, чтобы предотвратить обновление внешнего интерфейса сразу после изменения статических ресурсов. Значения прагмы для других значений не встречались.

Referer

Referer — очень часто используемый заголовок, который указывает исходный URI источника запроса, то есть родительскую страницу текущего ресурса страницы. Если вы перейдете со страницы A на страницу B, в заголовке запроса страницы B будет информация Referer, а ее значением будет адрес доступа к странице A. Отслеживая Referer, можно получить сложные цепочки переходов между страницами ресурсов, что очень удобно для анализа данных и оптимизации путей веб-страниц.

Retry-After

При обновлении сервера запрос от клиента напрямую выдает ошибку 503 (служба недоступна) путем добавления поля Retry-After в заголовок возврата, чтобы сообщить клиенту, когда служба может возобновить нормальный доступ. Заголовок Retry-After может быть HTTP-Date или целым числом, указывающим, через сколько секунд после того, как служба сможет возобновить нормальный доступ. Получив это значение, браузер может рассмотреть возможность добавления таймера для повторной попытки в будущем.

Server

Он используется для возврата информации о программном обеспечении, связанном с сервером, чтобы сообщить клиенту, что текущая служба HTTP предоставляется определенным программным обеспечением, что можно рассматривать как своего рода рекламу программного обеспечения. Эта информация заголовка предупреждается в протоколе RFC: раскрытие информации о сервере может облегчить хакерам атаку на ваш сервис, рекомендуется использовать ее с осторожностью.

User-Agent

Несут текущую информацию об агенте пользователя, как правило, включая информацию о версии и модели браузера, ядра браузера и операционной системы. Он соответствует заголовку Server, один из которых содержит информацию о сервере, а другой — информацию о клиенте. Сервер может подсчитывать процент браузеров и операционных систем, используемых веб-службами, в соответствии с информацией пользовательского агента, а также сервер может настраивать различный контент в соответствии с информацией UA.

Transfer-Encoding

Какое преобразование необходимо сделать с данными Body при передаче информации Body. Когда HTTP передает тело блоками, перед выполнением передачи блока необходимо добавить следующую информацию заголовка. Другие виды пока не встречались.

Transfer-Encoding: chunked

Upgrade

Сервер рекомендует клиенту обновить транспортный протокол. Например, когда клиент отправляет запрос с использованием HTTP/1.0, сервер может предложить клиенту перейти на HTTP/1.1. В это время можно использовать заголовок Upgrade. После того, как клиент получит это обновление, он будет преобразовывать последующие запросы в формат HTTP/1.1 для продолжения связи. Можно поддерживать несколько параметров, разделенных запятыми.

Upgrade: HTTP/1.1

Когда клиент хочет связаться с сервером через Websocket, сервер также отправит клиенту информацию заголовка Upgrade во время фазы рукопожатия, предлагая клиенту переключить протокол на Websocket.

Upgrade: WebSocket

Vary

Этот заголовок используется для управления кешем. Для некоторых серверов кеша мы добавляем в запрос параметр Vary, чтобы указать серверу кеша использовать разные блоки кеша для ответов с разными параметрами Vary. Например, если параметр encoding помещен в параметр Vary, то разные закодированные веб-страницы будут иметь разные кэши. Может быть несколько значений Vary, пока любое из значений отличается, будут разные кеши. Например, следующий пример указывает серверу кеша использовать разные единицы кеша для ответов веб-страницы на разных языках и в разных кодировках.

Vary: Accept-Encoding,Accept-Language

Via

Это поле используется для идентификации узла маршрутизации шлюза, через который проходит запрос. Если запрос проходит через несколько уровней прокси, в заголовке Via будет информация о нескольких шлюзах.

Warning

Используется для добавления дополнительной информации о предупреждении в ответ. Информация о предупреждении содержит код ошибки и описание ошибки. Некоторые распространенные коды ошибок указаны в протоколе RFC. Например, код ошибки № 111 указывает на то, что срок действия кэшированного элемента кэш-сервера истек, и он пытается перезагрузить ресурс, но перезагрузка не удалась, поэтому необходимо вернуть старый просроченный контент.В это время клиент необходимо вернуть клиенту через заголовок предупреждения.

Warning: 111 Revalidation failed

WWW-Authenticate

WWW-Authenticate — это заголовок, который должен передаваться при возврате кода ошибки несанкционированного доступа 401. Этот заголовок будет содержать вопрос Challenge для клиента, информирующий клиента о том, что ему необходимо передать ответ на этот вопрос, чтобы запросить сервер, прежде чем он сможет продолжить доступ к целевому ресурсу. Такого рода проблемы Challenge можно настраивать, и наиболее распространенной является обычная проверка подлинности.

WWW-Authenticate: Basic realm=xxx

Базовый относится к алгоритму шифрования base64 (небезопасный), а область относится к имени области/события/сценария аутентификации.

Authorization

Для некоторых ресурсов, для доступа к которым требуются специальные разрешения, клиент должен предоставить в запросе данные аутентификации, такие как имя пользователя и пароль. Это ответ на WWW-Authenticate.

# value = base64(user_name:password)
Authorization: Basic YWRtaW46YWRtaW4xMjM=

Proxy-Authenticate

То же, что и заголовок WWW-Authorization, используемый для аутентификации прокси-сервера.

Proxy-Authorization

То же, что и заголовок авторизации, используемый для аутентификации прокси-сервера.

ETag vs Last-Modified vs Expires

ETag обычно содержит номер версии ресурса, а протокол не указывает, что это за номер версии. Это может быть md5-код ​​проверки ресурса, или uuid, или даже автоинкрементное число, или время модификации ресурса. То, как оно соответствует, равно/не равно. Поскольку серверу необходимо поддерживать номера версий, в зависимости от того, какие номера версий, это может быть нагрузкой на хранилище и вычисления.

Время модификации ресурса, переносимого Last-Modified. То, как оно соответствует, больше/меньше. Если это статический файл ресурсов, обычно это время модификации файла, записанное операционной системой.

Expires — это время истечения срока действия ресурса, сообщаемое сервером клиенту. Ресурс, кэшированный клиентом, автоматически истекает по истечении этого времени, и нет необходимости подтверждать серверу, является ли он 304 Not Modified, прежде чем он будет считаться не просроченным.

Cache-Control

Это, вероятно, самый сложный заголовок в заголовке HTTP. Этот заголовок может использоваться как для запросов, так и для ответов. Значения запроса и ответа разные, и они представляют разные значения.

  1. no-cache Если no-cache не указан, это означает, что кэширование не разрешено. Для запросов сервер НЕ ДОЛЖЕН возвращаться напрямую с кэшированным содержимым. Для ответов клиент НЕ ДОЛЖЕН кэшировать содержимое ресурса ответа. Если no-cache указывает значение, это означает, что информация заголовка, соответствующая этому значению, не должна кэшироваться, а другая информация все же может быть кэширована. Скажите собеседнику, что мне нужны только свежие данные из ванны.
  2. no-store указывает другой стороне не сохранять данные запроса/ответа в другом месте, эта информация является конфиденциальной и должна храниться в неустойчивом состоянии. Просто скажите собеседнику, чтобы он сохранил это в памяти, не записывайте на бумаге (диске).
  3. no-transform сообщает другой стороне не преобразовывать данные. Например, если клиент загружает необработанные данные изображения, сервер обычно выборочно сжимает данные изображения для хранения. no-transform указывает другой стороне сохранить исходную информацию о данных и не выполнять никаких преобразований. Скажи им, чтобы не связывались с тем, что я послал.
  4. only-if-cached используется в заголовке запроса, чтобы указать серверу не перезагружаться, пока содержимое кэшировано. Если кэшированного содержимого нет, возвращается ошибка 504 Gateway Timeout. Указывает, что клиент не хочет слишком беспокоить сервер.
  5. max-age используется для заголовков запросов. Ограничьте возраст кэшированного контента. Если он превышает максимальный возраст, серверу необходимо перезагрузить ресурс контента. Это называется возрастной дискриминацией клиентов.
  6. max-stale используется для заголовков запросов. Клиент позволяет серверу возвращать содержимое кэшированного ресурса, срок действия которого истек, но ограничивает максимальное время истечения срока действия. Это значит, что клиент хоть и очень толерантен, но и ограничен.
  7. min-fresh используется для заголовков запросов. Клиент ограничивает сервер от содержимого ресурсов, срок действия которых истекает. Точно так же, как мы идем в супермаркет, чтобы купить молоко, если срок годности молока подходит к концу, мы не будем рассматривать его, даже если срок годности еще не истек.
  8. public используется в заголовках ответов. Указывает, что клиенту разрешено кэшировать информацию ответа и делать ее доступной для других. Например, прокси-сервер кэширует статические ресурсы для использования всеми пользователями прокси.
  9. private используется для заголовков ответов. Указывает, что клиенту разрешено кэшировать информацию ответа только для собственного использования, а не делиться ею с другими. Это делается для предотвращения кэширования прокси-сервером и позволяет клиенту кэшировать содержимое ресурсов самостоятельно. Это означает, что вы можете оставить его себе, не одалживая его другим.

Поскольку сведений о протоколе HTTP очень много, приведенный выше текст не может полностью объяснить все сведения о заголовке HTTP. В последующем [Code Cave] мы продолжим обновлять более подробные статьи Читателям рекомендуется обратить внимание на публичный аккаунт [Code Cave], чтобы увидеть соответствующие статьи как можно скорее.