@ Whymarrh touché!

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

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

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

например

Излишне указывать обаExpires а такжеCache-Control: max-ageили указать обаLast-Modified а такжеETag.

ИсточникHTTP / 1.1: определения полей заголовка

Ответы на вопрос(2)

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

На языкеRFC 2119, терминДОЛЖЕН означает, что что-то является требованием спецификации, и несоблюдение этого требования будет недействительным. Там нет полей заголовка, определенных RFC7230, 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 поле заголовка отсутствует, получатель МОЖЕТ либо принять тип носителяapplication/octet-stream (RFC2046, раздел 4.5.1) или изучите данные, чтобы определить их тип.

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

Исходный сервер, который не поддерживает постоянные соединенияДОЛЖЕН ОтправитьConnection: close в каждом ответе, который не имеет кода состояния 1xx.Исходный серверДОЛЖЕН генерироватьAllow заголовок в ответе 405 (метод не разрешен).Исходный сервер, генерирующий 401 (неавторизованный) ответДОЛЖЕН ОтправитьWWW-Authenticate поле заголовка, содержащее хотя бы одну задачу.

но обычно ответ от исходного сервера должен иметь:

СвиданиеТип содержимогосервер

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

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

 algal01 сент. 2014 г., 07:22
@ Whymarrh touché!
 Beni03 февр. 2011 г., 16:31
Спасибо за ответ! Но я не думаю, что заголовок «Server» важен. Это также небольшая защита, чтобы избежать этой записи заголовка. У злоумышленников нет «никакой» информации, такой как «OS / Webserver / -version».
 Mark Nottingham07 февр. 2011 г., 07:40
Сервер строго не требуется, но некоторые клиенты, кажется, хотят его, IIRC. Определенно сократить его до минимума. WRT Connection: нет, это то, что сервер намерен делать с соединением; он выбирает, что отправить.
 Mark Nottingham26 апр. 2013 г., 02:27
Строго говоря, ни один из них не требуется; если вы посмотрите RFC2616 (и документы httpbis), вы увидите, что Date может быть опущен, если на исходном сервере нет часов; content-type может быть опущен (по умолчанию - application / octet-stream), и сервер рекомендуется, но не обязателен для MUST. Это по крайней мере частично, потому что мы должны быть несколько обратно совместимы с HTTP / 0.9, у которого вообще не было заголовков. однако, чтобы ответ был полезным, он нужен.
 Whymarrh30 авг. 2014 г., 23:09
@algal Когда это приходит от одного из авторов спецификаций, я думаю, что все в порядке.

Ваш ответ на вопрос