[Перевод] Те заголовки HTTP, которые нам не нужны

задняя часть HTTP браузер Программа перевода самородков

Если вы хотите узнать больше об информации заголовка http, пожалуйста, подпишитесь на 22 маяРечь Андрея в Лондоне.

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

Большинство разработчиков понимают некоторую информацию заголовка HTTP и используют ее для обработки контента. как все знаютContent-TypeиContent-Length, они все общие. Но недавно,Content-Security-PolicyиStrict-Transport-SecurityТакие заголовки использовались для повышения безопасности,Link rel=preloadИспользуется для повышения производительности. Только очень немногие веб-сайты используют их, хотя они широко поддерживаются браузерами.

В то же время существует множество уже существующих и очень популярных заголовков, которые не практичны. мы можем использоватьHTTP-архивчтобы подтвердить это.HTTP-архивэто проект, спонсируемый Fastly и управляемый Google, используется ежемесячноWebPageTest500 000 веб-сайтов загружены и протестированы на производительность, результаты опубликованы вBigQuery.

В данных архива HTTP приведен список из 30 самых популярных заголовков ответа (на основе подсчета заголовков большинства сайтов в процессе архивирования), а также обзор того, насколько они полезны:

Header name Requests Domains Status
date 48779277 535621 Required by protocol
content-type 47185627 533636 Usually required by browser
server 43057807 519663 Unnecessary
content-length 42388435 519118 Useful
last-modified 34424562 480294 Useful
cache-control 36490878 412943 Useful
etag 23620444 412370 Useful
content-encoding 16194121 409159 Required for compressed content
expires 29869228 360311 Unnecessary
x-powered-by 4883204 211409 Unnecessary
pragma 7641647 188784 Unnecessary
x-frame-options 3670032 105846 Unnecessary
access-control-allow-origin 11335681 103596 Useful
x-content-type-options 11071560 94590 Useful
link 1212329 87475 Useful
age 7401415 59242 Useful
x-cache 5275343 56889 Unnecessary
x-xss-protection 9773906 51810 Useful
strict-transport-security 4259121 51283 Useful
via 4020117 47102 Unnecessary
p3p 8282840 44308 Unnecessary
expect-ct 2685280 40465 Useful
content-language 334081 37927 Debatable
x-aspnet-version 676128 33473 Unnecessary
access-control-allow-credentials 2804382 30346 Useful
x-robots-tag 179177 24911 Not relevant to browsers
x-ua-compatible 489056 24811 Useful
access-control-allow-methods 1626129 20791 Useful
access-control-allow-headers 1205735 19120 Useful

Акцентируем внимание только на тех заголовках, которые здесь не нужны, и объясняем, почему они не нужны и что с ними делать.

Бесполезная информация (server, x-powered-by, via)

Вы можете гордиться своим выбором серверного программного обеспечения, но большинству людей (пользователей) все равно. И эта информация заголовка может привести к утечке вашей конфиденциальной информации и сделать ваш сайт атакованным.

Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid

RFC7231Стандарт позволяет серверу включать в ответServerИнформация заголовка, которая идентифицирует серверное программное обеспечение, используемое для обслуживания содержимого. Наиболее распространенными являются «apache» и «nginx». Хотя это разрешено, это не является обязательным, но на самом деле это мало что значит для разработчиков или конечных пользователей. Однако на сегодняшний день это третий по популярности заголовок HTTP-ответа в Интернете.

X-Powered-By— это популярный заголовок, который не определен ни в одном стандарте и также обычно используется для обозначения платформы прикладного программного обеспечения за веб-сервером. Распространенными значениями являются «ASP.net», «PHP» и «Express», которые на самом деле не дают никакой пользы и занимают место.

Спорнее должно бытьVia, при добавлении к ответу любого прокси, который идентифицирует прокси, через который он передается,RFC7230Требуется его оговорка. Это может быть полезно при проксировании имен хостов, но чаще всего это общий идентификатор, такой как «vegur», «varnish» или «squid». Удаление или не установка этого заголовка технически противоречит спецификации, но ни один браузер ничего с ним не делает, так что ничего страшного, если вы захотите его удалить.

Устаревшие стандарты (P3P, Expires, X-Frame-Options)

Другой тип заголовков http — это те, которые имеют эффект в браузере, но не являются (или больше не являются) лучшим способом сделать это.

P3P: cp="this is not a p3p policy"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN

P3PЭто любопытная вещь. Я не знаю об этом, и мне даже любопытно, что его наиболее распространенным значением является «это не политика p3p». Так это или нет?

Это восходит кПопытки стандартизировать машиночитаемые политики конфиденциальности, возникли разногласия по поводу того, как отображать данные в браузере, и только один браузер реализовал этот http-заголовок — Internet Explorer. Даже в браузере IE,P3PОн также не приносит никаких визуальных эффектов пользователю, ему просто нужно разрешить доступ к сторонним файлам cookie в iframe. Некоторые сайты даже устанавливают нестандартное правило P3P, например, приведенное выше, хотя это и нежелательно.незаконный.

Излишне говорить, что чтение сторонних файлов cookie, как правило, не рекомендуется, поэтому вам также не нужно устанавливать их, если вы планируете этого не делать.P3Pинформация заголовка

ExpiresПопулярность достигла невероятного состояния, представьте себе такую ​​ситуацию,Cache-ControlСрок действия истекает через 20 лет. еслиCache-Controlинформация заголовка содержитmax-ageинструкция, то любая на тот же ответExpiresинформация заголовка будет проигнорирована. Но существует большое количество веб-сайтов, которые устанавливают и то, и другое.ExpiresИнформация заголовка обычно устанавливается по Гринвичу --Thu, 01 Dec 1994 16:00:00. Многие люди делают это, потому что не хотят, чтобы содержимое сайта кэшировалось и копировалось, поэтому они простоиз спецификацииСкопируйте эту дату экземпляра для заполнения.

Screen Shot 2018-05-10 at 21.49.25

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

Cache-Control: no-cache, private

Некоторые инструменты, которые проверяют ваш сайт, позволяют добавить значение «SAMEORIGIN».X-Frame-Optionsинформация заголовка. Это сообщает браузеру, что вы отказываетесь от фреймов других веб-сайтов, что также является мерой предосторожности.нажмите атакураспространенный метод. Тем не менее, следующая более последовательная поддержка и более надежное определение поведения могут достичь того же эффекта:

Content-Security-Policy: frame-ancestors 'self'

В рамках информации заголовка (csp) вы также получаете другие преимущества (подробнее об этом позже). так что у тебя может не бытьX-Frame-Optionsинформация заголовка.

Данные отладки (X-ASPNet-версия, X-кэш)

Удивительно, но некоторые из наиболее часто используемых заголовков не имеют никакого стандарта. На практике это означает, что тысячи веб-сайтов спонтанно соглашаются использовать определенные заголовки http определенным образом.

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).

Особенно,X-CacheНа самом деле он добавляется Fastly (другие CDN также делают это) и некоторая другая информация заголовка, связанная с Fastly, такая какX-Cache-HitsиX-Served-By. Когда отладка включена, мы добавляем больше заголовков, напримерFastly-Debug-PathиFastly-Debug-TTL.

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

Неправильно распознается (Прагма)

Я не собирался писать статью о заголовке «Pragma» в 2018 году, но он по-прежнему занимает 11-е место по данным нашего HTTP-архива. Pragma устарела еще в 1997 году, и она никогда не предназначалась для использования в качестве заголовка ответа — как указано, она имеет смысл только как часть запроса.

Pragma: no-cache

Тем не менее, он настолько широко используется в качестве заголовка ответа, что некоторые браузеры также распознают его. Теперь ваш ответ пройдет идентификациюPragmaкеш без распознаванияCache-Controlвероятность мала. Если вы хотите убедиться, что что-то не кэшировано, вам просто нужноCache-Control: no-cache, private.

Без браузера (тег X-Robots)

Один из 30 лучших заголовков не является браузерным заголовком.X-Robots-TagИспользуется против поисковых роботов, таких как боты Google и Bing. Поскольку для браузера он не имеет никакого значения, вы можете установить этот заголовок только тогда, когда вам нужно иметь дело со сканерами. В то же время это может затруднить тестирование или нарушить условия обслуживания поисковой системы.

Bugs

Наконец, стоит упомянуть о простых ошибках. впроситьсередина,HostЕсть смысл в том, что заголовок есть, но если он присутствует в ответе, вероятно, ваша служба неправильно настроена (мне бы хотелось знать, как это произошло). Тем не менее, упомянутый выше HTTP-архив вернул 68 доменов.Hostинформация заголовка.

удалить информацию заголовка

Если ваш сайт использует услуги Fastly, поздравляем, используйтеVCLУдобно удалять информацию заголовка. Возможно, вы захотите сохранить действительно полезные отладочные данные для своей команды разработчиков, но скрыть их от публичных пользователей, что имеет большой смысл, что вы можете легко сделать, проверив файлы cookie или передав заголовки HTTP:

unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;

if (!req.http.Cookie:debug && !req.http.Debug) {
  unset resp.http.X-Amzn-RequestID;
  unset resp.http.X-Cache;
}

В следующей статье этой серии я расскажу о лучших методах настройки заголовков HTTP и о том, как их включить.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.