Битлента
Сетевые команды и утилиты5 мин чтения·

curl -I и -L: как посмотреть заголовки ответа и цепочку редиректов

Как командой curl увидеть заголовки сервера и проследить все перенаправления по шагам: ключи -I, -i, -L, -v, --max-redirs и разбор заголовка Location.

Кратко

Ключ -I показывает только заголовки, -i добавляет их к телу ответа, а -L заставляет curl идти по перенаправлениям. Связка curl -sIL адрес выводит заголовки каждого звена цепочки — видно, куда и с каким кодом вас отправляют.

Что показывают заголовки и зачем на них смотреть

Заголовки ответа — служебная часть, которую браузер обычно скрывает. Из них видно, какой код вернул сервер, какого типа содержимое, как долго его можно хранить в кэше, куда перенаправлять и какие куки устанавливаются. Когда страница открывается «не так, как надо» — зацикливается, ведёт не на тот адрес, показывает старую версию, — ответ часто лежит именно в заголовках.

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, тот отправляет с имени без приставки на имя с ней, затем на главную страницу с языковой папкой.

  1. Выполните curl -sIL адрес и найдите в выводе повторяющиеся блоки, начинающиеся со строки статуса.
  2. В каждом блоке запишите код и значение Location. Так получится карта переходов.
  3. Если блоки одинаковы и повторяются, налицо петля. curl остановится сам после лимита и сообщит, что превышено максимальное число перенаправлений.
  4. Для точного числа переходов выполните curl -sL -o /dev/null -w "%{num_redirects} %{url_effective}\n" адрес. Первое значение — число переходов, второе — конечный адрес.
  5. Чтобы увидеть, что происходит без переходов, запустите 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. Приложите время проверки и свой внешний адрес: по ним специалист поймёт, на каком узле воспроизводится проблема. Не публикуйте заголовки, содержащие куки сессии или токены: они дают доступ к вашей учётной записи.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно
curlзаголовки httpредиректыдиагностика

Часто задаваемые вопросы

Читайте также