HTTP Заголовки

Просмотрите все HTTP-заголовки ответа сервера

Как проверить HTTP-заголовки ответа сервера

Инструмент отправляет HEAD-запрос к указанному адресу с сервера PingDesk и выводит код статуса и все заголовки, которые вернул сервер. По спецификации на HEAD сервер отвечает теми же заголовками, что и на обычный GET, но без тела страницы, поэтому проверка быстрая и не нагружает сайт.

По заголовкам видно, как настроены защита в браузере, кэширование и сжатие, какой сервер или CDN стоит перед сайтом, выставляет ли он cookies. Это удобно после правки конфигурации nginx, Apache или CDN: не нужно открывать инструменты разработчика или подключаться к серверу по SSH.

Как пользоваться проверкой заголовков

  1. 1Введите домен или полный URL, например example.ru или https://example.ru/catalog. Если протокол не указан, запрос пойдёт по HTTPS.
  2. 2Нажмите «Получить». Если сервер отвечает редиректом, сервис пройдёт по цепочке — до пяти переходов — и покажет заголовки конечного ответа.
  3. 3Посмотрите код статуса в заголовке карточки результата: 2xx — ответ получен, 3xx — цепочка редиректов длиннее пяти шагов или зациклена, 4xx и 5xx — ошибка доступа или сервера.
  4. 4Пройдитесь по списку заголовков. Имена выводятся строчными буквами: регистр имён в HTTP не важен, а в HTTP/2 и HTTP/3 они и передаются только строчными.
  5. 5Сверьте заголовки безопасности и кэширования с таблицами ниже и поправьте конфигурацию веб-сервера, CDN или приложения, если чего-то не хватает.

Заголовки безопасности: какие нужны сайту

Пока всё в порядке, эти заголовки никак не меняют работу сайта для посетителя. Зато они ограничивают ущерб от XSS, встраивания страницы в чужой фрейм и подмены типов файлов — и их отсутствие первым делом отмечают сканеры безопасности.

Основные заголовки безопасности
ЗаголовокПример значенияЗачем нужен
Strict-Transport-Securitymax-age=31536000; includeSubDomainsБраузер открывает сайт только по HTTPS в течение max-age секунд
Content-Security-Policydefault-src 'self'; frame-ancestors 'self'Ограничивает источники скриптов, стилей и фреймов — основной барьер против XSS
X-Frame-OptionsSAMEORIGINЗапрещает встраивать страницу во фреймы чужих сайтов; в CSP его заменяет frame-ancestors
X-Content-Type-OptionsnosniffЗапрещает браузеру «угадывать» тип файла вопреки Content-Type
Referrer-Policystrict-origin-when-cross-originОпределяет, какую часть адреса страницы передавать другим сайтам в Referer
Permissions-Policycamera=(), microphone=(), geolocation=()Отключает доступ к API браузера, которыми сайт не пользуется

Нужен ли X-XSS-Protection

Нет. Этот заголовок управлял встроенным XSS-фильтром, который современные браузеры убрали. Защиту от XSS сегодня обеспечивает Content-Security-Policy, а X-XSS-Protection можно не отдавать вовсе.

HSTS: как включить и не заблокировать себе сайт

Strict-Transport-Security говорит браузеру: в течение max-age секунд обращаться к домену только по HTTPS, а при ошибке сертификата не давать пользователю обойти предупреждение. Заголовок, полученный по обычному HTTP, браузер игнорирует, поэтому его нужно отдавать в HTTPS-ответах.

Начинайте с небольшого max-age — например, 300 секунд — и увеличивайте его до года, когда убедитесь, что сайт и все поддомены стабильно работают по HTTPS. Директива includeSubDomains распространяет правило на все поддомены, включая внутренние сервисы без сертификата.

Директива preload нужна для включения домена во встроенный в браузеры список HSTS. Для этого требуются max-age не меньше года, includeSubDomains и preload, а исключение из списка занимает месяцы — добавляйте домен туда, только если отказываться от HTTPS точно не придётся.

Заголовки кэширования: Cache-Control, ETag, Last-Modified

Кэширование определяется сочетанием нескольких заголовков, а итоговое поведение зависит ещё и от настроек CDN. Вот что означают основные из них:

Заголовок или директиваЧто означает
Cache-Control: max-age=3600Ответ можно хранить и отдавать без обращения к серверу 3600 секунд
Cache-Control: no-cacheХранить можно, но перед каждым использованием нужно проверить актуальность у сервера
Cache-Control: no-storeОтвет нельзя сохранять ни в браузере, ни в промежуточных кэшах
Cache-Control: private / publicprivate — хранит только браузер пользователя, public — также CDN и прокси
Cache-Control: s-maxageСрок хранения для общих кэшей — CDN и прокси; для них важнее max-age
ETag, Last-ModifiedВалидаторы: по ним браузер делает условный запрос и получает короткий ответ 304 Not Modified
AgeСколько секунд ответ уже лежит в кэше CDN или прокси
ExpiresУстаревший способ задать срок жизни; при наличии max-age игнорируется
VaryПо каким заголовкам запроса кэш различает версии ответа, например Accept-Encoding

Частые ошибки настройки кэша

Самая опасная ошибка — no-cache вместо no-store на страницах с персональными данными: no-cache не запрещает хранить ответ. Обратная ситуация — no-store на статике, которую можно кэшировать надолго. Для файлов с хешем в имени, например app.3f2a1c.js, подходит max-age=31536000, immutable, а для HTML — короткий срок или no-cache вместе с ETag.

Редиректы и заголовок Location

При редиректе сервер возвращает код 301, 302, 303, 307 или 308 и адрес назначения в заголовке Location. Инструмент сам проходит по такой цепочке — до пяти переходов — и показывает заголовки конечного ответа. Если в результате всё равно код 3xx, цепочка длиннее пяти шагов, зациклена или в ответе нет Location.

Чтобы увидеть промежуточные шаги, выполните запрос без следования редиректам — curl -sI http://example.ru — и повторите его для адреса из Location. Хорошая схема — один постоянный редирект (301 или 308) с любого варианта адреса сразу на канонический: с HTTP на HTTPS и на нужную версию с www или без за один переход. Каждый лишний шаг добавляет задержку, а петли делают страницу недоступной.

Сжатие и другие полезные заголовки

Помимо безопасности и кэша, в ответе стоит обратить внимание на несколько служебных заголовков:

  • Content-Encoding: br, gzip или zstd — ответ сжат. Отсутствие заголовка в ответе на HEAD ещё не доказывает, что сжатия нет: проверьте обычным запросом — curl -s -o /dev/null -D - -H 'Accept-Encoding: br, gzip' https://example.ru/.
  • Content-Type — тип и кодировка содержимого; для HTML ожидается text/html; charset=utf-8.
  • Server и X-Powered-By — раскрывают используемое ПО и иногда его версию. X-Powered-By лучше отключить, а версию в Server скрыть, например директивой server_tokens off в nginx.
  • Заголовки CDN, например cf-cache-status у Cloudflare или x-cache у других сетей, показывают, отдан ли ответ из кэша.
  • Access-Control-Allow-Origin — правило CORS: каким сайтам разрешено читать ответ из JavaScript. Значение * нельзя сочетать с передачей cookies и авторизации.

Частые вопросы

Как посмотреть HTTP-заголовки сайта?

+

Введите адрес в форму выше — сервис покажет код статуса и все заголовки ответа. Ещё их можно увидеть в браузере на вкладке «Сеть» инструментов разработчика или командой curl -I https://example.ru.

Какие security headers обязательно настроить?

+

Базовый набор — Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options: nosniff, Referrer-Policy и защита от встраивания во фреймы через frame-ancestors или X-Frame-Options. Permissions-Policy полезен, если нужно явно запретить доступ к камере, микрофону и геолокации.

Как понять, кэшируется ли страница?

+

Посмотрите Cache-Control, Expires, ETag и Last-Modified, а также Age и заголовки CDN вроде cf-cache-status или x-cache. Ненулевой Age или значение HIT обычно означают, что ответ отдан из кэша.

Чем no-cache отличается от no-store?

+

no-cache разрешает сохранить ответ, но требует перед каждым использованием проверить у сервера, не изменился ли он. no-store запрещает сохранять ответ вообще — его используют для страниц с персональными и платёжными данными.

Почему заголовок HSTS не работает?

+

Чаще всего заголовок отдаётся только в HTTP-ответах, а браузер учитывает его лишь при получении по HTTPS. Также проверьте синтаксис: значение max-age=0 не включает, а отменяет HSTS.

Почему инструмент показывает не те заголовки, что в браузере?

+

Сервис отправляет HEAD-запрос без cookies и авторизации, проходит по редиректам и показывает ответ конечной страницы. Браузер же может показывать ответ из своего кэша, а сервер или CDN — отдавать разные заголовки в зависимости от метода запроса, сессии и региона.

Что показывает заголовок Server и стоит ли его скрывать?

+

Он сообщает тип веб-сервера, а иногда и точную версию. Тип скрывать необязательно, а версию лучше убрать: она упрощает поиск известных уязвимостей.

Связанные инструменты