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

Эта статья продолжает тему родительского материала Анны Соколовой, где основной вывод сводился к тому, что видимая страница и служебный ответ сервера могут расходиться. Там мы говорили о том, что ответ сервера часто содержит больше значимой информации, чем кажется по содержимому страницы. Здесь разберём, как превратить это наблюдение в практику: какие инструменты использовать, в каком порядке проверять заголовки, на что смотреть в ответе и как оценить безопасность по значениям, а не по одному лишь факту наличия.
Второе — вести сравнительную таблицу до и после изменений, чтобы любой откат был обоснованным
Что понадобится для проверки HTTP-заголовков
Базовый набор состоит из онлайн-инструмента, который позволяет отправить запрос с произвольным User-Agent и выбрать метод HEAD или GET. HEAD возвращает только заголовки и не тянет тело ответа, что удобно для массовой проверки, а GET полезен там, где заголовки формируются динамически уже при генерации контента. Указание User-Agent критично: многие конфигурации отдают разные заголовки роботам и обычным браузерам, и без явного выбора агента вы проверяете лишь один из двух сценариев.
Вторым инструментом служат DevTools браузера, вкладка Network. Её задача — сверить заголовки, которые получает реальный пользователь, с результатом онлайн-проверки. Расхождения между ними обычно указывают на расширения, service worker, кэш браузера или подмену заголовков на уровне CDN. Для воспроизводимых проверок удобна командная строка: curl -I показывает заголовки ответа, а curl -v добавляет детали согласования TLS и цепочки перенаправлений, что важно при диагностике HSTS и редиректов.
Отдельно нужен список обязательных заголовков безопасности, с которым вы будете сверяться: HSTS, Content-Security-Policy, X-Content-Type-Options, Referrer-Policy и Permissions-Policy. Без эталона легко принять частичную реализацию за полную. Наконец, если аномалия в заголовках повторяется, потребуется доступ к логам сервера или CDN, чтобы связать конкретный ответ с запросом, его временем и узлом, который его обработал.
Порядок действий при проверке
Начинайте с главной страницы и страницы, которая заведомо перенаправляет. Зафиксируйте код статуса и всю цепочку переходов. На практике встречаются цепочки из трёх и более перенаправлений после миграции на HTTPS или смены структуры URL; каждое лишнее звено увеличивает задержку и ухудшает передачу сигналов индексации. Правило простое: один редирект на URL, а не череда последовательных переходов.
Далее проверьте Content-Type, Content-Length, Cache-Control, ETag и Last-Modified на соответствие типу ресурса. HTML-страница с типом application/octet-stream или картинка с text/html — это не косметика, а причина неправильного отображения и игнорирования кэша. Content-Length при сжатии должен соответствовать фактическому размеру передаваемых данных, иначе клиент может обрезать ответ или зависнуть в ожидании.
Сравните ответы для десктопного и мобильного User-Agent, а также с включённым и выключенным заголовком Accept-Encoding. Различия в Vary, Content-Encoding или в наборе Link-заголовков сигнализируют о скрытой логике на сервере. Оцените значения заголовков безопасности, а не только их наличие: это принципиальное различие, которое разберём в отдельном разделе. Результаты зафиксируйте в виде сравнительной таблицы «до и после» изменений — не для публикации, а для последующего аудита, чтобы при очередном деплое видеть, что именно изменилось.
Анализ ответа сервера: на что смотреть
Код статуса нужно читать по его семантике. Ответ 200 на странице, которая по смыслу должна быть 404, — это так называемая мягкая ошибка: поисковик индексирует пустышку, а пользователь получает бессмысленный документ. Аналогично различие между 301 и 302: 301 сообщает о постоянном переносе и передаёт сигнал на новый адрес, 302 — о временном, и использование его для постоянной миграции ведёт к тому, что старый адрес продолжает удерживать позиции.
Заголовки кэширования требуют внимания к конфликтам. Cache-Control с max-age и Expires с другой датой, Vary без перечисления нужных значений, отсутствие Vary при различающемся контенте — типичные причины того, что CDN или прокси отдают устаревшую версию. Важно помнить, что промежуточные узлы могут переписывать эти заголовки, поэтому ответ origin-сервера и ответ edge-узла нужно проверять отдельно.
Заголовки сжатия и кодировки — Content-Encoding, Transfer-Encoding и корректность параметра charset в Content-Type — определяют, как клиент декодирует тело. Несоответствие charset и реальной кодировки даёт кракозябры, которые часто принимают за проблему шрифтов. Заголовки Server и X-Powered-By раскрывают версии ПО; решение о их скрытии принимается исходя из модели угроз, но минимизация информации о стеке — обычно разумный выбор.
Для поисковых роботов важны X-Robots-Tag, Link с rel=canonical и Link для hreflang. Они могут задавать индексацию не в HTML, а на уровне HTTP, и если в теле страницы стоит одна директива, а в заголовке другая, приоритет будет у заголовка. Именно поэтому аудит должен охватывать оба слоя одновременно. Для тех, кто хочет разобраться в этом подробнее, удобно начать с проверки http заголовков — она показывает, какие заголовки реально получает конкретный клиент, и помогает сравнить ответы сервера на разные запросы.
Оценка безопасности через HTTP-заголовки
HSTS заставляет браузер использовать только HTTPS для домена на заданный срок. Ключевые параметры — max-age, includeSubDomains и условия для preload. Типичная ошибка при внедрении — слишком малый max-age, который не даёт реальной защиты, либо, наоборот, большой срок вместе с includeSubDomains без проверки всех поддоменов: если какой-то поддомен не работает по HTTPS, он станет недоступен, а откатить такую политику в браузерах быстро не получится.

Content-Security-Policy нужно проверять по значениям. Наличие unsafe-inline и unsafe-eval делает политику формальной: заголовок есть, но защита от внедрения скриптов почти не работает. Полезно наличие report-uri или report-to, а на этапе внедрения разумно использовать режим Content-Security-Policy-Report-Only, чтобы увидеть нарушения без поломки сайта.
Защита от clickjacking строится на сочетании X-Frame-Options и frame-ancestors. Современные браузеры отдают приоритет frame-ancestors, поэтому если два заголовка противоречат друг другу, поведение становится непредсказуемым. Согласованность проверяется простым сопоставлением значений. Для cookie в Set-Cookie обязательны проверки атрибутов Secure, HttpOnly и SameSite; ожидаемые значения зависят от назначения: сессионная cookie требует HttpOnly и Secure, а трекинговая может иметь иной SameSite по причинам межсайтового сценария.
Политики ограничения возможностей браузера и утечек — Referrer-Policy, Permissions-Policy и Cross-Origin-Opener-Policy — влияют на то, какие данные уходят на сторонние ресурсы и какие API доступны странице. Referrer-Policy со значением unsafe-url передаёт полный адрес откуда угодно, тогда как strict-origin-when-cross-origin ограничивает утечку до домена. Permissions-Policy стоит задавать явно, отключая камеру, микрофон и геолокацию там, где они не используются.
Чеклист критериев для быстрой оценки
- Статус и цепочка редиректов соответствуют намерению, без более одного перенаправления на URL.
- Заголовки кэширования не противоречат друг другу и соответствуют типу контента.
- Присутствуют HSTS, CSP, X-Content-Type-Options и Referrer-Policy с осмысленными значениями, а не формальной заготовкой.
- Set-Cookie содержит атрибуты безопасности, подходящие для назначения каждого cookie.
- Ответы для разных User-Agent и кодировок согласованы, без скрытых различий для робота и пользователя.
- Раскрытие версий ПО и технологий сведено к минимуму.
Где чаще всего ошибаются
Самая распространённая ошибка — проверять только главную страницу. Разделы администрирования, API и страницы ошибок часто настраиваются отдельно, и заголовки там могут полностью отличаться. Аудит, который ограничивается одним URL, даёт ложное ощущение завершённости. Минимальный набор для проверки включает главную, типовую внутреннюю страницу, страницу с редиректом, страницу 404 и хотя бы один API-эндпоинт.
Вторая ошибка — принимать наличие заголовка за его корректность. Это особенно касается CSP с unsafe-inline и HSTS с занижённым max-age. Третья — не учитывать CDN: заголовок в ответе origin может быть переписан или отсутствовать в ответе edge-узла, и без проверки обоих уровней картина остаётся неполной. Четвёртая — путать 302 и 301, что ведёт к проблемам с передачей сигналов индексации и сохранением старых позиций.
Пятая ошибка связана с HSTS: внедрение с большим max-age и includeSubDomains без инвентаризации поддоменов создаёт риск недоступности сервисов, которые пока не переведены на HTTPS. Шестая — менять заголовки и не перепроверять их после деплоя, опираясь на старые результаты аудита. Конфигурация живёт вместе с кодом, и любая правка может незаметно сломать политику, которая вчера работала.
Вывод и рекомендации
Проверка HTTP-заголовков превращает разрозненные настройки сервера в управляемую систему. Её ценность в том, что она показывает разрыв между тем, что видит пользователь, и тем, что получают робот, кэш и браузер безопасности. Практический порядок выглядит так: зафиксировать статусы и редиректы, проверить кэширование и кодировки, оценить значения заголовков безопасности по существу, сверить результаты для разных User-Agent и уровней CDN, а затем повторить проверку после каждого изменения.
Если сжать рекомендации до минимума, они сводятся к трём действиям. Первое — внедрять строгие политики поэтапно, начиная с режима отчётов для CSP и с умеренного max-age для HSTS. Третье — проверять не только главную страницу, но и типовые разделы, API и страницы ошибок. Такой подход снижает риск скрытых ошибок и делает аудит воспроизводимым, что и было главным выводом родительского материала: служебный ответ сервера заслуживает такого же внимания, как и видимое содержимое страницы.