Просмотр заголовков ответа
Введите адрес и прочитайте, что сервер сообщает до того, как отдать страницу: строку статуса и каждый заголовок, для каждого редиректа по пути. Рядом с каждым заголовком короткая заметка о том, зачем он там.
Часть веб-страницы, которую вы никогда не видите
Ответ веб-сервера устроен как посылка. Страница лежит внутри коробки. Снаружи наклеена этикетка: первая строка с трёхзначным кодом статуса, а за ней список строк вида Name: value, которые называются заголовками. Браузер сначала читает этикетку и по ней решает почти всё: показать или скачать, сохранить ли копию, перейти ли по другому адресу, какие cookie запомнить.
На экране заголовков не видно, поэтому в них прячется много странного поведения. Страница, которая не обновляется, редирект по кругу, шрифт, заблокированный на другом домене, вход, который не держится. Чаще всего виноват один заголовок с неверным значением.
Что делает этот инструмент
Наш сервер отправляет на введённый адрес один запрос GET, такой же, какой отправляет браузер, и записывает ответ. Если ответ оказывается редиректом (статус 3xx с заголовком Location), он запрашивает новый адрес и записывает и его, до восьми раз. Вы получаете по одному блоку на каждый ответ, по порядку, и видите, какой сервер добавил какой заголовок и на каком шаге.
Каждый заголовок мы ищем в словаре из более чем 130 имён и показываем его семейство и пояснение в одно предложение. Семейства такие:
| Семейство | Типичные заголовки | На какой вопрос отвечают |
|---|---|---|
| Кеширование | Cache-Control, ETag, Age, X-Cache | Можно ли это хранить, как долго и ответил ли кеш? |
| Содержимое | Content-Type, Content-Encoding, Content-Length | Что в теле ответа и как оно упаковано? |
| Безопасность | Strict-Transport-Security, Content-Security-Policy | Какие защиты браузера включены? |
| Cookie | Set-Cookie | Что браузер должен запомнить? |
| Междоменные запросы | Access-Control-Allow-Origin | Могут ли скрипты других сайтов это читать? |
| Соединение | Alt-Svc, Date, Keep-Alive | Как управляется связь с сервером? |
| Сервер и CDN | Server, Via, CF-RAY, X-Served-By | Какая программа и какая сеть ответили? |
| Диагностика | Server-Timing, X-Request-Id | Сколько времени это заняло и как найти запрос в логах? |
Имя, которого нет в словаре, помечается как собственный или редкий заголовок. Любая программа вправе придумывать свои, так что эта пометка будет попадаться часто, и ничего плохого в ней нет. Длительности и размеры переводятся в понятный вид, где это помогает: max-age=31536000 показывается как 365 дней.
В сводке указаны итоговый статус, версия HTTP, которую согласовал наш сервер, число редиректов, программа из заголовка Server и число заголовков в последнем ответе. Оценок здесь нет. Если нужна оценка, её даёт проверка заголовков безопасности.
Как читать строку статуса
- 2xx: запрос выполнен.
200это обычный случай. - 301 и 308: переехало навсегда. Браузеры и поисковики запоминают новый адрес. 302, 303 и 307: пока идите туда, а исходный адрес остаётся основным.
- 4xx: сервер отказывает или не находит то, что запросили.
403на странице, которая нормально открывается в вашем браузере, часто означает, что сайт блокирует автоматические запросы. - 5xx: сбой на самом сервере. Коды от
520до526выдаёт CDN, который не смог достучаться до сервера за ним.
Четыре вещи, которые с его помощью проверяют
- «Почему посетители всё ещё видят старую версию?»
- Посмотрите
Cache-ControlиAge. Длинныйmax-ageу HTML-страницы означает, что браузеры не спросят снова, пока он не истечёт.X-CacheилиCF-Cache-Statusсо значениемHITозначает, что CDN отдал свою копию и её нужно сбросить. - «Сжатие включено?»
- Ищите
Content-Encoding: br,gzipилиzstd. Если у HTML-страницы этого заголовка нет, она передаётся в полном размере. - «Откуда берётся этот редирект?»
- Сравните заголовок
Serverна каждом шаге. Редирект, на который ответил CDN, настроен в его панели. Тот, на который ответили nginx или Apache, прописан в конфигурации сервера. Тот, у которого естьX-Redirect-By, называет приложение или плагин, который его выдал. - «На чём работает этот сайт?»
Server,X-Powered-ByиViaчасто называют веб-сервер, язык и CDN. На своём сайте номера версий из этих заголовков стоит убрать.
Вы видите заголовки, которые наш сервер получил на один анонимный запрос. Сайт может отвечать иначе вошедшему посетителю, мобильному браузеру, другой стране или другому Accept-Language. Имена заголовков показаны в привычном написании. HTTP/2 и HTTP/3 передают их строчными буквами, как в исходном блоке, и регистр никогда не важен.
Частые вопросы
Как посмотреть заголовки ответа в своём браузере?
Откройте инструменты разработчика (F12, или Cmd+Option+I на Mac), перейдите на вкладку Network, перезагрузите страницу и нажмите на первый запрос. На панели Headers те же строки. Этот инструмент нужен, когда так сделать нельзя: на телефоне, для ссылки, которую вы не хотите открывать, или чтобы увидеть ответ клиенту без cookie.
Чем заголовки запроса отличаются от заголовков ответа?
Заголовки запроса уходят вместе с вопросом браузера: какая страница, какие языки и форматы он принимает, какие cookie у него есть. Заголовки ответа возвращаются от сервера вместе с ответом. Эта страница показывает только заголовки ответа.
Заголовки с X- стандартные?
Префикс X- был соглашением для неофициальных заголовков. Некоторые всё равно стали общепринятыми, например X-Frame-Options и X-Content-Type-Options. От соглашения отказались в 2012 году, поэтому у новых собственных заголовков префикса часто нет вовсе.
Почему я получаю не те заголовки, что показывает мой браузер?
Потому что это другой запрос. Серверы и CDN подстраиваются под user agent клиента, его cookie, язык и местоположение, а кешированная копия может нести заголовки, созданные несколько часов назад. Заголовок Vary перечисляет, какие заголовки запроса сервер учитывает.
Нужно ли скрывать заголовки Server и X-Powered-By?
Скрыть название продукта почти ничего не даёт. А вот убрать номера версий стоит этих двух минут: автоматические сканеры по ним выбирают, какие известные уязвимости пробовать. В nginx это server_tokens off;, в Apache ServerTokens Prod, в PHP expose_php = Off.
Если заголовка нет, значит что-то не так?
Обычно нет. Content-Type это единственный заголовок, который ожидается почти в каждом ответе с телом. Нужность остальных зависит от того, чего вы хотите. Без Cache-Control кеширование остаётся на усмотрение каждого браузера, а без заголовков безопасности дополнительные защиты остаются выключенными.