Что показывают заголовки и зачем на них смотреть
Заголовки ответа — служебная часть, которую браузер обычно скрывает. Из них видно, какой код вернул сервер, какого типа содержимое, как долго его можно хранить в кэше, куда перенаправлять и какие куки устанавливаются. Когда страница открывается «не так, как надо» — зацикливается, ведёт не на тот адрес, показывает старую версию, — ответ часто лежит именно в заголовках.
curl показывает их одним из трёх способов: -I отправляет запрос HEAD и печатает только заголовки; -i делает обычный GET и выводит заголовки перед телом; -v включает подробный режим, где заголовки запроса помечены знаком «>», а ответа знаком «<», плюс видны детали соединения и TLS.
Пример вывода для curl -sI example.com (пример): в первой строке HTTP/2 200 или HTTP/1.1 200 OK, ниже пары вроде content-type: text/html и content-length с размером. Регистр имён в HTTP/2 обычно нижний, в HTTP/1.1 привычный, и это нормально.
| Заголовок | Что означает |
|---|---|
| Location | Куда перенаправлять при кодах 301, 302, 307, 308 |
| Content-Type | Тип и кодировка содержимого |
| Content-Length | Размер тела в байтах, если он известен заранее |
| Cache-Control | Правила кэширования для браузера и промежуточных узлов |
| Set-Cookie | Установка куки |
| Server | Программное обеспечение сервера, если оно раскрыто |
| Strict-Transport-Security | Требование открывать сайт только по HTTPS |
Ключи, которые понадобятся чаще всего
Комбинации ключей можно писать слитно: curl -sIL адрес означает тихий режим, HEAD-запрос и следование по перенаправлениям. Порядок букв не важен.
- -I — только заголовки через HEAD. Быстро и не тянет тело.
- -i — заголовки вместе с телом, удобно при отладке форм и API.
- -L — идти по Location. Без него curl остановится на первом ответе 3xx.
- --max-redirs N — ограничить число переходов; по умолчанию curl допускает до пятидесяти.
- -H "Имя: значение" — добавить свой заголовок в запрос, например User-Agent.
- -A строка — сменить строку User-Agent.
- -D файл — сохранить заголовки в файл, а тело оставить для вывода или для -o.
- -e адрес — указать заголовок Referer.
- --compressed — запросить сжатый ответ и распаковать его автоматически.
Если сервер не отвечает на HEAD корректно, вернёт 405 или другой код, отличающийся от GET. Тогда используйте curl -s -D - -o /dev/null адрес: заголовки выводятся в стандартный поток (дефис означает stdout), а тело выбрасывается. В Windows подставьте NUL и curl.exe.
Как проследить цепочку редиректов пошагово
Цепочка нужна, когда адрес ведёт не туда или страница «крутится». Типичная последовательность: http-версия отправляет на https, тот отправляет с имени без приставки на имя с ней, затем на главную страницу с языковой папкой.
- Выполните curl -sIL адрес и найдите в выводе повторяющиеся блоки, начинающиеся со строки статуса.
- В каждом блоке запишите код и значение Location. Так получится карта переходов.
- Если блоки одинаковы и повторяются, налицо петля. curl остановится сам после лимита и сообщит, что превышено максимальное число перенаправлений.
- Для точного числа переходов выполните curl -sL -o /dev/null -w "%{num_redirects} %{url_effective}\n" адрес. Первое значение — число переходов, второе — конечный адрес.
- Чтобы увидеть, что происходит без переходов, запустите curl -sI без -L и проверьте один шаг.
Код важен: 301 и 308 считаются постоянными, а 302 и 307 — временными. Коды 307 и 308 требуют сохранить метод запроса, а 301 и 302 в старом поведении позволяют клиентам заменить POST на GET. Для проверки ссылок на сайте достаточно знать, что постоянный редирект должен вести сразу на итоговый адрес, а не через две-три остановки.
Разбор типичных ситуаций
Случай первый: в браузере открывается старая версия страницы. Посмотрите Cache-Control и заголовки Age и Last-Modified, если они есть: возможно, ответ приходит из общего кэша, а не с исходного сервера. Случай второй: сайт открывается в браузере, а curl получает 403. Часть серверов реагирует на отсутствие заголовка User-Agent; добавьте -A с обычной строкой браузера для проверки. Случай третий: страница входа возвращает 302 и куки — включите -v, чтобы увидеть Set-Cookie, и сохраните куки в файл ключом -c.
Случай четвёртый: сертификат. Если curl завершается с кодом 60, это ошибка проверки сертификата, а не редиректа. Ключ -k отключает проверку и годится лишь для кратковременной локальной диагностики на собственных серверах, оставлять его в рабочих скриптах нельзя.
Не забывайте, что HEAD и GET могут различаться, а заголовки, которые вы видите, — то, что сервер отдал именно вам с вашего адреса и вашим User-Agent. У другого клиента результат может отличаться: часть сайтов подбирает ответ по региону, языку и устройству.
Windows, macOS и Linux
Синтаксис одинаков, различаются оболочки. В Windows вызывайте curl.exe, иначе в PowerShell 5.1 сработает псевдоним Invoke-WebRequest. В cmd многострочные команды переносят знаком ^, в PowerShell обратным апострофом, в bash и zsh обратной косой чертой. Для просмотра длинного вывода в Linux и macOS добавьте | less, в Windows | more. Пути к файлам в Windows содержат обратную косую черту, и если в них есть пробелы, весь путь берут в двойные кавычки. Кодировка вывода в старой консоли Windows иногда искажает русские символы в значениях заголовков, но на сами коды и латинские имена это не влияет.
Что делать с найденным
Когда заголовки и цепочка редиректов разобраны, дальнейшие шаги зависят от причины. Если адрес уводит на лишний промежуточный узел, владелец сайта может сократить цепочку до одного постоянного перенаправления: так страница открывается быстрее, а поисковые системы быстрее обновляют адреса. Если петля возникает между http и https, причина обычно в том, что сервер за балансировщиком не знает о схеме исходного запроса и снова перенаправляет на https; такое чинится настройкой заголовков на стороне сервера, а не на вашем компьютере.
Если заголовки показывают устаревший кэш, проверьте директивы Cache-Control и присутствие заголовка Age: большое значение говорит о том, что ответ отдан из промежуточного хранилища. Обновить страницу на своём сайте можно сбросом кэша сети доставки или изменением имени файла. Для чужого сайта вы можете лишь подождать либо обратиться к владельцу.
Сохраняйте вывод в файл для обращения в поддержку: curl -sIL адрес > headers.txt в Linux и macOS, то же в PowerShell и cmd. Приложите время проверки и свой внешний адрес: по ним специалист поймёт, на каком узле воспроизводится проблема. Не публикуйте заголовки, содержащие куки сессии или токены: они дают доступ к вашей учётной записи.