qatoolqa.ru

Разбор HTTP-заголовков ответа

Заголовки ответа сервера — половина ответа на вопрос «почему так себя ведёт». Вставьте их сюда: страница разложит по строкам и объяснит каждый — за что отвечает, какие значения бывают, что обычно ломается. Отдельно выделены группы кеша, CORS, безопасности и cookie.

Заголовки ответа

Что не так

Где взять блок

DevTools → вкладка Network → нужный запрос → правый клик по нему → Copy → Copy response headers. Вставляйте всё целиком: строку статуса я узна́ю, лишнего не будет.

Включите Preserve log, если смотрите на запрос, после которого происходит переход, — иначе он исчезнет из списка раньше, чем вы до него доберётесь.

Заголовки ответа, а не запроса. В панели Headers два раздела: Request Headers — то, что отправил браузер, Response Headers — то, что вернул сервер. Здесь разбираются вторые.

Пробуете на этой странице? Тогда набор будет скучным: qatoolqa.ru — статический сайт, у него только заголовки безопасности (CSP, HSTS, Referrer-Policy, nosniff) и кеша. Смотреть надо на том сервисе, который вы тестируете.

Три места, где ошибаются чаще всего

no-cache — это не «не кешировать». Ответ с ним сохраняется, просто перед каждым показом браузер спрашивает сервер, не изменилось ли. Чтобы ответ не сохранялся вовсе, нужен no-store. Путаница стоит утечек: страницу с чужими данными находят в кеше после выхода из учётной записи.

Звёздочка и учётные данные несовместимы. Access-Control-Allow-Origin: * вместе с Allow-Credentials: true браузер отвергает целиком — cookie в межсайтовом запросе так не работают. Нужен конкретный origin в ответе. Это самая частая причина «на сервере CORS настроен, а в браузере ошибка».

Cache-Control перебивает Expires. Если стоят оба, браузер смотрит только на первый. Расхождение между ними ничего не ломает, но и ничего не значит — а разбираются в нём подолгу.

Чего разбор не делает

Это разбор текста заголовков, а не проверка защищённости. Он видит, что написано, и не видит, что происходит на самом деле.

Например: Strict-Transport-Security учитывается браузером, только когда ответ пришёл по HTTPS — по обычному http он молча пропускается. Из текста заголовка это не узнать, нужен настоящий запрос.

Так же с Content-Security-Policy: разобрать её строку мало, надо смотреть, что политика на самом деле блокирует на живой странице. Это отдельная работа и отдельная вкладка в DevTools.

И замечания здесь — не приговор. Отсутствие nosniff на странице внутренней админки и на публичной форме загрузки файлов — разные по весу вещи, а инструмент видит только строку.

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

Откуда взять заголовки ответа?

DevTools → Network → нужный запрос → Response Headers, кнопка копирования. Либо curl -i. Вставляйте целиком, разбор сам разложит по строкам.

Почему браузер ругается на CORS, хотя заголовок есть?

Частые причины: Access-Control-Allow-Origin со звёздочкой при запросе с учётными данными, отсутствие ответа на preflight OPTIONS или неполный список разрешённых заголовков.

Что смотреть в заголовках кеша?

Cache-Control и его директивы, наличие ETag или Last-Modified и то, согласуется ли это с задачей страницы. Приватные данные с public в кеше — типичная находка.