Какие заголовки ответа HTTP требуются - PullRequest
55 голосов
/ 18 января 2011

Какие заголовки ответа HTTP необходимо отправить с сервера клиенту?

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

Я вижу много сайтов, которые отправляют избыточные заголовки кэша.

Например,

Этоизбыточно для указания Expires и Cache-Control: max-age или для указания Last-Modified и ETag.

  • Source
  • HTTP / 1.1:Определения полей заголовка

Ответы [ 2 ]

55 голосов
/ 31 августа 2014

Это зависит от того, что вы определяете как обязательное: нет полей заголовка, которые должны отправляться с каждым ответом, независимо от обстоятельств, но есть поля заголовка, которые вы действительно должны отправить.Единственное поле заголовка, которое подходит ближе - это Date, но даже в нем есть обстоятельства, при которых оно не требуется.

На языке RFC 2119 термин ДОЛЖЕН означает, что что-то является требованием спецификации, и несоблюдение этого требования будет недействительным.Поля заголовка не определены в RFC 7230 , 7231 , 7232 , 7233 , 7234 или 7235 чтобы ДОЛЖНО быть отправлено сервером происхождения во всех случаях .


Следующие заголовки, например, могут быть опущены (хотя вы, вероятно, должны их отправить):

7.1.1.2.Дата

Сервер происхождения НЕ ДОЛЖЕН отправлять поле заголовка Date, если у него нет часов, способных обеспечить разумную аппроксимацию текущего экземпляра в универсальном координированном времени.Исходный сервер МОЖЕТ отправить поле заголовка Date, если ответ находится в классе кодов состояния 1xx (информационный) или 5xx (ошибка сервера).Сервер происхождения ДОЛЖЕН отправить поле заголовка Date во всех остальных случаях.

Обратите внимание на последнее предложение цитаты.Поле заголовка Date ДОЛЖНО быть отправлено, если исходный сервер способен обеспечить «разумное приближение» даты в UTC, но ничто не мешает серверу исказить себя.

7.4.2.Сервер

Исходный сервер МОЖЕТ генерировать в своих ответах поле Server.

3.3.2.Content-Length

Помимо [конечного числа предопределенных случаев], при отсутствии Transfer-Encoding серверу происхождения СЛЕДУЕТ отправить поле заголовка Content-Length, когда размер тела полезной нагрузкиизвестен перед отправкой полного раздела заголовка.

Что касается Content-Length и Transfer-Encoding, обратите внимание, что ни один из них не может быть отправлен, и в этом случае длина ответа "определяетсяколичество октетов, полученных до того, как сервер закрыл соединение. "

3.1.1.5.Content-Type

Если поле заголовка Content-Type отсутствует, получатель МОЖЕТ либо принять тип носителя application/octet-stream (RFC2046, раздел 4.5.1), либо проверить данныечтобы определить его тип.


Существуют обстоятельства, при которых могут потребоваться определенные заголовки, например:

22 голосов
/ 03 февраля 2011

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

  • Дата
  • Тип содержимого
  • Сервер

и Content-Length, Transfer-Encoding или Connection: close.

Если вы хотите выполнить кэширование, добавьте Cache-Control (например, с max-age);Истекает, как правило, больше не нужно.Если вы хотите, чтобы клиенты могли выполнять проверку, добавьте Last-Modified или ETag.

...