Минимальная команда для проверки статуса
Код ответа HTTP — это первое, что нужно знать, когда страница «не открывается»: сервер вообще отвечает, отвечает ли ошибкой и какой именно. Браузер показывает красивую страницу-заглушку и часто прячет исходный код, а curl выдаёт его в одну строку и годится для скриптов.
Базовая форма выглядит так: curl -s -o /dev/null -w "%{http_code}" example.com. Здесь -s отключает индикатор загрузки, -o /dev/null отправляет тело ответа в никуда, а -w задаёт формат вывода после завершения запроса. Переменная http_code подставляет итоговый код. Чтобы результат не слипался с приглашением командной строки, добавьте перевод строки: -w "%{http_code}\n".
Пример вывода (пример): после выполнения команды в терминале появится 200. Это значит, что сервер принял запрос и вернул страницу. Если адрес указан без схемы, curl по умолчанию пойдёт по http, а не по https, поэтому для проверки защищённой версии схему стоит указать явно.
| Ключ | Что делает |
|---|---|
| -s | Тихий режим, без полосы прогресса |
| -o файл | Записывает тело ответа в файл вместо вывода на экран |
| -w формат | Печатает выбранные переменные после запроса |
| -I | Отправляет запрос HEAD и показывает только заголовки |
| -L | Следует за перенаправлениями |
Отличия для Windows, macOS и Linux
В Linux и macOS curl установлен по умолчанию, а нулевое устройство называется /dev/null. В Windows 10 и 11 утилита тоже есть в составе системы, но в Windows PowerShell 5.1 слово curl является псевдонимом для командлета Invoke-WebRequest, и ключи вроде -s он не поймёт. Поэтому пишите curl.exe с расширением. Вместо /dev/null подставляйте NUL: curl.exe -s -o NUL -w "%{http_code}" example.com.
Кавычки тоже различаются. В командной строке cmd двойные кавычки работают как обычно, а если команда лежит в bat-файле, знак процента нужно удваивать: %%{http_code}. В PowerShell выражение с фигурными скобками и процентом лучше брать в одинарные кавычки, чтобы оболочка не пыталась его интерпретировать. В bash и zsh подойдут и двойные, и одинарные.
Если вы работаете в PowerShell 7, псевдоним curl там убран, и вызов работает без расширения. Но привычка писать curl.exe безопасна в любой версии, потому что не зависит от настроек профиля.
Как читать полученный код
Первая цифра задаёт класс ответа, и уже по ней можно понять, где искать проблему.
| Код | Смысл | Куда смотреть |
|---|---|---|
| 200 | Успех | Страница отдаётся, проблема, скорее всего, на стороне браузера или кэша |
| 301, 302, 307, 308 | Перенаправление | Добавьте -L или смотрите заголовок Location |
| 401, 403 | Нужна авторизация или доступ ограничен | Проверьте учётные данные и правила сервера |
| 404 | Адрес не найден | Опечатка в пути или страница удалена |
| 429 | Слишком много запросов | Снизьте частоту проверок |
| 500, 502, 503, 504 | Ошибка на стороне сервера или шлюза | Повторите позже, сообщите владельцу сайта |
| 000 | Ответа нет | Не удалось разрешить имя, соединиться или дождаться ответа |
Код 000 curl печатает, когда HTTP-обмен не состоялся. В этом случае смотрите код завершения самой программы. Он лежит в переменной $? в Linux и macOS или в %errorlevel% в cmd. Часто встречаются 6 (не удалось разрешить имя хоста), 7 (не удалось подключиться), 28 (истекло время ожидания), 35 (ошибка установки TLS-соединения) и 60 (сертификат сервера не прошёл проверку). Для подробностей к 000 добавьте ключ -v, он покажет, на каком этапе оборвалось соединение.
Проверка сразу нескольких адресов
Чаще всего нужна не одна страница, а десяток. В Linux и macOS это решается коротким циклом: создайте файл urls.txt по одному адресу на строку и выполните while read u; do echo -n "$u "; curl -s -o /dev/null -w "%{http_code}\n" --max-time 10 "$u"; done < urls.txt. Каждая строка результата будет содержать адрес и код.
В PowerShell можно пройти по строкам файла циклом foreach ($u in Get-Content urls.txt) и внутри вызвать curl.exe с теми же ключами. Ключ --max-time обязателен: без него зависший сервер остановит весь список. Между запросами полезно делать паузу в секунду-две, чтобы не создавать лишней нагрузки на чужой сайт и не попасть под ограничение по частоте.
Проверять таким способом стоит свои сайты и сервисы либо публичные страницы разумным числом запросов. Массовые запросы к чужим ресурсам могут быть расценены как злоупотребление.
Типичные ошибки при получении кода
- Забыли -L, и вместо итогового 200 получили 301: адрес перенаправляет на другую версию, например с http на https или с одного имени на другое.
- Использовали -I и получили 405: не все серверы принимают HEAD. В таком случае достаточно обычного GET с выбрасыванием тела через -o.
- В PowerShell вызвали curl без .exe и получили сообщение о неизвестном параметре.
- Проверяли адрес без схемы и не заметили, что curl пошёл по http, а не по https.
- Не задали таймаут в скрипте, и один недоступный адрес завис на минуты.
- Приняли 200 за признак корректной работы. Некоторые сайты отдают 200 вместе с сообщением об ошибке в тексте страницы, и на такие случаи стоит смотреть ещё и на размер ответа через переменную size_download.
Если нужно понять, почему запрос медленный, а не почему он не проходит, переходите к измерению этапов через ключ -w с временными переменными. А если код странный и вы хотите увидеть заголовки целиком, вам поможет соседняя инструкция про ключи -I и -L.
Код ответа в автоматизации и мониторинге
Проверку кода удобно превратить в простой мониторинг собственного сайта. В Linux достаточно записать в файл расписания задачу, которая раз в несколько минут вызывает curl с ключом --max-time и записывает время и код в журнал. Если код отличается от ожидаемого, скрипт отправляет вам уведомление. Для этого не нужно специальное программное обеспечение: ключ -f заставляет curl завершаться с ненулевым кодом на ответах 4xx и 5xx, а условный оператор оболочки реагирует на этот код.
Учтите две особенности. Во-первых, проверять надо конечную страницу, а не редирект: используйте -L, иначе мониторинг будет успешно получать 301 и не заметит, что итоговая страница недоступна. Во-вторых, лучше проверять не только код, но и признак содержимого: можно добавить в вывод size_download и сравнить размер с обычным. Если страница внезапно стала весить пару сотен байт вместо десятков килобайт, сервер, вероятно, отдаёт страницу-заглушку под видом успеха.
Для сайтов за системой защиты от роботов запрос без обычного User-Agent может получить отказ, хотя в браузере всё открывается. В таких случаях сравнивайте результат с тем, что видит настоящий клиент, и не делайте выводов только по одному ответу.