Ненужные HTTP-заголовки
Заголовки HTTP важны для контроля, как кэш и браузеры обрабатывают ваш контент. Но многие из них используются неправильно или бессмысленно, затрачивая лишние ресурсы в критический момент загрузки страницы, и они могут работать не так, как вы думаете. В серии статей о лучших практиках сначала рассмотрим ненужные заголовки.
В то же время есть много чрезвычайно популярных заголовков, которые вообще не новые и не очень полезные. Мы можем это доказать с помощью HTTP Archive, проекта под управлением Google и спонсируемого Fastly, который каждый месяц при помощи WebPageTest скачивает 500 000 сайтов и выкладывает результаты в BigQuery.
Вот 30 самых популярных заголовков ответов по данным HTTP Archive (на основе количества доменов в архиве, которые выдают каждый заголовок), и примерная оценка полезности каждого из них:
| Заголовок | Запросов | Доменов | Статус |
|---|---|---|---|
| date | 48779277 | 535621 | Требуется по протоколу |
| content-type | 47185627 | 533636 | Обычно требуется браузером |
| server | 43057807 | 519663 | Необязателен |
| content-length | 42388435 | 519118 | Полезен |
| last-modified | 34424562 | 480294 | Полезен |
| cache-control | 36490878 | 412943 | Полезен |
| etag | 23620444 | 412370 | Полезен |
| content-encoding | 16194121 | 409159 | Требуется для сжатого контента |
| expires | 29869228 | 360311 | Необязателен |
| x-powered-by | 4883204 | 211409 | Необязателен |
| pragma | 7641647 | 188784 | Необязателен |
| x-frame-options | 3670032 | 105846 | Необязателен |
| access-control-allow-origin | 11335681 | 103596 | Полезен |
| x-content-type-options | 11071560 | 94590 | Полезен |
| link | 1212329 | 87475 | Полезен |
| age | 7401415 | 59242 | Полезен |
| x-cache | 5275343 | 56889 | Необязателен |
| x-xss-protection | 9773906 | 51810 | Полезен |
| strict-transport-security | 4259121 | 51283 | Полезен |
| via | 4020117 | 47102 | Необязателен |
| p3p | 8282840 | 44308 | Необязателен |
| expect-ct | 2685280 | 40465 | Полезен |
| content-language | 334081 | 37927 | Спорно |
| x-aspnet-version | 676128 | 33473 | Необязателен |
| access-control-allow-credentials | 2804382 | 30346 | Полезен |
| x-robots-tag | 179177 | 24911 | Не имеет значения для браузеров |
| x-ua-compatible | 489056 | 24811 | Необязателен |
| access-control-allow-methods | 1626129 | 20791 | Полезен |
| access-control-allow-headers | 1205735 | 19120 | Полезен |
Давайте посмотрим на необязательные заголовки, почему они нам не нужны и что с этим делать.
Тщеславие (server, x-powered-by, via)
Вы можете очень гордиться своим выбором серверного ПО, но большинству людей на это наплевать. В худшем случае эти заголовки могут разглашать конфиденциальные данные, что упрощает атаку на ваш сайт.
Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid
X-Powered-By — самый популярный заголовок из тех, что не определены никаким стандартом, и у него похожая цель: обычно он указывает платформу приложений, на которой работает сервер. Самые популярные ответы включают в себя «ASP.net», «PHP» и «Express». Опять же, это не несёт никакой ощутимой пользы и просто занимает место.
Устаревшие стандарты (P3P, Expires, X-Frame-Options, X-UA-Compatible)
Другая категория заголовков — это те, которые действительно вызывают эффект в браузере, но (уже) представляют собой не лучший способ достижения данного эффекта.
P3P: cp=»this is not a p3p policy»
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge
P3P — забавная штучка. Я понятия не имел, что это такое. Ещё забавнее, что одно из самых распространённых содержаний заголовка P3P — «Это не правило P3P». Ну так это оно или нет?
Тут история восходит к попытке стандартизировать машиночитаемые правила приватности. Были разногласия по поводу того, как отображать данные в браузерах, и только один браузер реализовал поддержку этого заголовка — Internet Explorer. Но даже в нём P3P не имел никакого визуального эффекта для пользователя; он просто должен был присутствовать, чтобы разрешить доступ к сторонним кукам во фреймах. Некоторые сайты даже установили правила несоблюдения P3P, как в примере выше, хотя делать так весьма сомнительно.
Но просто незачем это делать. Если у вас заголовок Expires с датой из прошлого, просто замените его на:
Cache-Control: no-store, private
( no-store — слишком строгая директива не записывать контент в постоянное хранилище, так что вы можете предпочесть no-cache ради лучшей производительности, например, для навигации назад/вперёд или возобновления «спящих» вкладок в браузере)
Некоторые инструменты проверки сайтов посоветуют добавить заголовок X-Frame-Options со значением ‘SAMEORIGIN’. Он говорит браузерам, что вы отказываетесь отдавать контент во фрейм на другом сайте: как правило, это хорошая защита от кликджекинга. Но того же эффекта можно достигнуть другим заголовком с более последовательной поддержкой и более надёжным поведением:
Content-Security-Policy: frame-ancestors ‘self’
Данные для отладки (X-ASPNet-Version, X-Cache)
В каком-то роде удивительно, что некоторые из самых популярных заголовков вообще не упоминаются ни в каком стандарте. По сути это значит, что тысячи веб-сайтов каким-то образом внезапно договорились использовать определённый заголовок определённым образом.
X-Cache: HIT
X-Request-ID: 45a336c7-1bd5-4a06-9647-c5aab6d5facf
X-ASPNet-Version: 3.2.32
X-AMZN-RequestID: 0d6e39e2-4ecb-11e8-9c2d-fa7ae01bbebc
На самом деле, эти «неизвестные» заголовки не выдумали разработчики. Обычно это артефакты использования определённых серверных фреймворков, софта или сервисов конкретных поставщиков (например, последний заголовок типичен для AWS).
Эти заголовки не распознаются ни одним браузером, а их удаление совершенно не отразится на отображении страниц. Но поскольку они могут предоставить вам, разработчику, полезную информацию, то можете их сохранить.
Недоразумения (Pragma)
Не-браузеры (X-Robots-Tag)
Один заголовок в нашем топ-30 не является заголовком для браузера. X-Robots-Tag предназначен для краулеров, таких как боты Google или Bing. Поскольку для браузера он бесполезен, то можете установить такой ответ только на запросы краулеров. Или вы решите, что это затрудняет тестирование или нарушает условия использования поисковой системы.
Наконец, стоит закончить почётном упоминанием простых ошибок. Заголовок Host имеет смысл в запросе, но если он встречается в ответе, то вероятно ваш сервер неправильно настроен (и я хотел бы знать, как именно). Тем не менее 68 доменов в HTTP Archive возвращают заголовок Host в своих ответах.
Удаление заголовков на edge-сервере CDN
К счастью, если ваш сайт работает у нас на Fastly, то удалить заголовки довольно просто с помощью VCL. Если хотите сохранить команде разработчиков действительно полезные данные для отладки, но скрыть их от общей публики, то это легко делается по куки или входящему заголовку HTTP:
unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;
В следующей статье я расскажу о лучших практиках для действительно нужных заголовков и как активировать их на edge-сервере CDN.
Что такое поле «Content-Length» в заголовке HTTP?
особенно в случае «Content-Type: application / x-www-form-urlencoded».
8 ответов:
не имеет значения, какой тип контента.
Это количество байтов данных в тело запроса или ответа. Тело-это часть, которая идет после пустой строки под заголовками.
The Content-Length заголовок-это число, обозначающее точную длину байта тела HTTP. Тело HTTP запускается сразу после первой пустой строки, найденной после начальной строки и заголовков.
вообще используется для HTTP 1.1, так что принимающая сторона знает, когда текущий ответ * закончил, так что соединение может быть повторно использовано для другого запроса.
кроме того, Content-Length заголовок может быть опущен и фрагментирован Transfer-Encoding заголовок можно использовать.
если как Content-Length и Transfer-Encoding заголовки отсутствуют, то в конце ответа соединение должно быть закрыто.
поле content-Length entity-header указывает размер объекта-тела, в десятичном числе октетов, отправленных в получатель или, в случае Головной метод, размер сущность-тело, которое было бы отправлено если бы просьба была получена.
приложения должны использовать это поле для укажите длину передачи тело сообщения, если это запрещено правилами в 4.4.
любая длина содержимого больше или равное нулю-допустимое значение. Раздел 4.4 описывает, как определить длина тела сообщения, если a Content-длина не указана.
заметим, что значение этого поля значительно отличается от соответствующее определение в MIME, где используется необязательное поле внутри » сообщение / внешнее тело» тип содержимого. В HTTP это должно быть отправляется всякий раз, когда длина сообщения может быть определено до того, чтобы быть передается, если это не запрещено по правилам в разделе 4.4.
моя интерпретация заключается в том, что это означает длину «на проводе», т. е. длину *закодированного» контента
наиболее распространенное использование POST, безусловно, это представить данные HTML-формы в CGI файлы сценариев. В этом случае Тип содержимого: заголовок, как правило, приложение / x-www-form-urlencoded, и содержание-длина: заголовок дает длина URL-кодированной формы данные (вот примечание по URL-кодированию). Сценарий CGI получает сообщение тело через STDIN, и расшифровывает его. Вот типичная форма подачи, с помощью Сообщение:
поле content-Length entity-header указывает размер тела Сущности в десятичном числе октетов, отправленных получателю, или, в случае метода HEAD, размер тела сущности, который был бы отправлен, если бы запрос был GET.
приложения должны использовать это поле для указания длины передачи тела сообщения, если только это запрещено правилами раздела 4.4.
допустимым значением является любая длина содержимого, превышающая или равная нулю. В разделе 4.4 описывается, как определить длину тела сообщения, если длина содержимого не задана.
обратите внимание, что значение этого поля значительно отличается от соответствующего определения в MIME, где это необязательное поле, используемое в типе контента «сообщение/внешнее тело». В HTTP он должен отправляться всякий раз, когда сообщение длина может быть определена до передачи, если это не запрещено правилами в разделе 4.4.
поле content-Length entity-header указывает размер тела Сущности в десятичном числе октетов, отправленных получателю, или, в случае метода HEAD, размер тела сущности, который был бы отправлен, если бы запрос был GET.
приложения должны использовать это поле для указания длина передачи тела сообщения.
в PHP вы бы использовали что-то вроде этого.
в случае «Content-Type: application/x-www-form-urlencoded» закодированные данные отправляются назначенному агенту обработки, чтобы вы могли установить длину или размер данных, которые вы собираетесь опубликовать.
Что такое поле «Content-Length» в заголовке HTTP?
особенно в случае «Content-Type: application / x-www-form-urlencoded».
8 ответов
не имеет значения, что такое content-type.
Это количество байтов данных в тело запроса или ответа. Тело-это часть, которая появляется после пустой строки под заголовками.
на Content-Length заголовок-это число, обозначающее точную длину байта тела HTTP. Тело HTTP запускается сразу после первой пустой строки, найденной после начальной строки и заголовков.
вообще Content-Length заголовок используется для HTTP 1.1, чтобы принимающая сторона знала, когда текущий ответ * закончил, так что соединение можно повторно использовать для другого запроса.
кроме того, Content-Length заголовок можно опустить и chunked Transfer-Encoding заголовок можно использовать.
если как Content-Length и Transfer-Encoding заголовки отсутствуют, затем в конце ответа соединение должно быть закрыто.
поле сущности-заголовка Content-Length указывает размер тела сущности, в десятичном числе октетов, отправленных получатель или, в случае Головной метод, размер сущность-тело, которое было бы отправлено если бы запрос был сделать.
приложения должны использовать это поле для укажите длину передачи тело сообщения, если это запрещено правилами в 4.4.
любое содержание-длина больше или равно нулю-допустимое значение. Раздел 4.4 описывает, как определить длина тела сообщения, если a Content-длина не указана.
заметим, что значение этого поля значительно отличается от соответствующее определение в MIME, где используется необязательное поле внутри » сообщение / внешнее тело» тип содержимого. В HTTP это должно быть отправлено, когда длина сообщения может быть определено до быть передается, если это не запрещено по правилам раздела 4.4.
моя интерпретация заключается в том, что это означает длину «на проводе», т. е. длину *закодированного» контента
поле entity-header Content-Length указывает размер тела Сущности в десятичном числе октетов, отправленных получателю, или, в случае метода HEAD, размер тела сущности, которое было бы отправлено, если бы запрос был GET.
приложения должны использовать это поле для указания длины передачи тела сообщения, если только это запрещено правилами в разделе 4.4.
любое содержимое-длина больше или равна нулю является допустимым значением. В разделе 4.4 описывается, как определить длину тела сообщения, если длина содержимого не указана.
обратите внимание, что значение этого поля значительно отличается от соответствующего определения в MIME, где это необязательное поле, используемое в типе содержимого «сообщение/внешнее тело». В HTTP он должен быть отправлен всякий раз, когда сообщение длина может быть определена до передачи, если это не запрещено правилами в разделе 4.4.
поле entity-header Content-Length указывает размер тела Сущности в десятичном числе октетов, отправленного получателю, или, в случае метода HEAD, размер тела сущности, которое было бы отправлено, если бы запрос был GET.
Content-Length = » Content-Length «:» 1*цифра
приложения должны использовать это поле для указания длина передачи тела сообщения.
в PHP вы бы использовали что-то вроде этого.
в случае «Content-Type: application / x-www-form-urlencoded» закодированные данные отправляются агенту обработки, назначенному для установки длины или размера данных, которые вы собираетесь опубликовать.
Что такое поле Content-Length в заголовке HTTP?
Особенно в случае «Content-Type: application/x-www-form-urlencoded».
ОТВЕТЫ
Ответ 1
Не имеет значения, каков тип содержимого.
Ответ 2
Ответ 3
Ответ 4
Как правило, заголовок Content-Length используется для HTTP 1.1, так что получающая сторона знает, когда текущий ответ * завершен, поэтому можно повторно использовать для другого запроса.
Ответ 5
Поле заголовка объекта Content-Length указывает размер тела объекта, в десятичном числе OCTET, отправленных в получателя или, в случае HEAD, размер сущность-орган, который был бы отправлен если бы запрос был GET.
Приложения СЛЕДУЕТ использовать это поле для указать длину передачи тело сообщения, если это не запрещено правилами в разделе 4.4.
Любая длина содержимого больше или равное нулю, является допустимым значением. Раздел 4.4 описывает, как определить длина тела сообщения, если Content-Length не указывается.
Обратите внимание, что значение этого поля равно существенно отличается от соответствующее определение в MIME, где используется дополнительное поле внутри «сообщения/внешнего тела», Тип содержимого. В HTTP это ДОЛЖНО отправляется всякий раз, когда длина сообщения может быть определенными до переданы, если это не запрещено по правилам в разделе 4.4.
Моя интерпретация заключается в том, что это означает длину «на проводе», то есть длину * закодированного содержимого
Ответ 6
Наиболее распространенное использование POST, безусловно, заключается в отправке данных формы HTML в CGI скрипты. В этом случае Content-Type: заголовок обычно применение/х-WWW-форм-urlencoded, и заголовок Content-Length: длина URL-кодированной формы данных (здесь примечание о кодировании URL). CGI script получает сообщение тело через STDIN и декодирует его. Здесь типичная подача формы, используя POST:
Ответ 7
Поле Content-Length entity-header указывает размер тела сущности, десятичного числа OCTET, отправленного получателю или, в случае метода HEAD, размер тела объекта, который будет иметь был отправлен, если запрос был GET.
Приложения СЛЕДУЕТ использовать это поле, чтобы указать длину передачи тела сообщения, если это не запрещено правилами в разделе 4.4.
Любое содержание-длина, большее или равное нулю, является допустимым значением. Раздел 4.4 описывает, как определить длину тела сообщения, если Content-Length не задано.
Обратите внимание, что значение этого поля существенно отличается от соответствующего определения в MIME, где оно является необязательным полем, используемым в типе контента «message/external-body». В HTTP он ДОЛЖЕН быть отправлен всякий раз, когда длина сообщения может быть определена до передачи, если это не запрещено правилами в разделе 4.4.
Ответ 8
Поле Content-Length entity-header указывает размер тела сущности, десятичного числа OCTET, отправленного получателю или, в случае метода HEAD, размер тела объекта, который будет иметь был отправлен, если запрос был GET.
Content-Length = «Content-Length» «:» 1 * DIGIT
Приложения СЛЕДУЕТ использовать это поле, чтобы указать длину передачи тела сообщения.
В PHP вы бы использовали что-то вроде этого.
В случае «Content-Type: application/x-www-form-urlencoded» закодированные данные отправляются агенту обработки, указанному так, что вы можете установить длину или размер данных, которые собираетесь отправлять.
What’s the «Content-Length» field in HTTP header?
9 Answers 9
It’s the number of bytes of data in the body of the request or response. The body is the part that comes after the blank line below the headers.
The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.
It doesn’t matter what the content-type is.
The Content-Length header is a number denoting an the exact byte length of the HTTP body. The HTTP body starts immediately after the first empty line that is found after the start-line and headers.
Generally the Content-Length header is used for HTTP 1.1 so that the receiving party knows when the current response * has finished, so the connection can be reused for another request.
Alternatively, Content-Length header can be omitted and a chunked Transfer-Encoding header can be used.
If both Content-Length and Transfer-Encoding headers are missing, then at the end of the response the connection must be closed.
The following resource is a guide that I found very useful when learning about HTTP:
One octet is 8 bits. Content-length is the number of octets that the message body represents.
The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.
Applications SHOULD use this field to indicate the transfer-length of the message-body, unless this is prohibited by the rules in section 4.4.
Any Content-Length greater than or equal to zero is a valid value. Section 4.4 describes how to determine the length of a message-body if a Content-Length is not given.
Note that the meaning of this field is significantly different from the corresponding definition in MIME, where it is an optional field used within the «message/external-body» content-type. In HTTP, it SHOULD be sent whenever the message’s length can be determined prior to being transferred, unless this is prohibited by the rules in section 4.4.







