У меня есть бизнес-требование: просмотреть список URL-адресов и определить те, которые возвращают ошибку. Я написал простой скрипт, который извлекает заголовок для определенного URL-адреса, поскольку мне не важен контент. Я просто хочу знать, есть ли ошибка при загрузке контента. В некоторых случаях мой скрипт возвращает ошибку 503, а также возвращает контент. Вот один пример.
$ curl --head https://www.eia.gov/consumption/
HTTP/1.1 503 Service Unavailable
Server: AkamaiGHost
Mime-Version: 1.0
Content-Type: text/html
Content-Length: 175
Expires: Fri, 05 Jan 2018 21:32:47 GMT
Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache
Date: Fri, 05 Jan 2018 21:32:47 GMT
Connection: keep-alive
Выполнение той же команды curl без части "--head" возвращает страницу HTML, а не страницу с ошибкой. Это релевантный контент. Итак, эта ошибка 503 вводит в заблуждение.
Это неправильно настроенный веб-сервер, возвращающий неверный заголовок ответа, или я что-то упустил?
Настоящий вопрос таков: Есть ли надежный способ определить, возвращает ли URL-адрес действительный контент или возвращает ошибку? В этом случае полезно наличие HTML, но я бы не стал рассчитывать на возвращение HTML, а значит, ошибки нет. Ошибка 404 - классический случай получения страницы HTML, но код ошибки говорит мне, что страница не найдена.
В --head
вариант делает curl
отправить фактический HTTP HEAD
запрос. Некоторые серверы могут не учитывать это или могут не маршрутизировать его так же, как HTTP GET
запрос, такой как браузер отправит. Используя -i
опция будет печатать заголовки ответов, но по-прежнему отправлять GET
запрос. Это также вернет все тело ответа. Вы можете сократить это до первой строки, содержащей версию протокола и статус ответа, только с head
команда так:
$ curl -si https://www.eia.gov/consumption/ | head -n 1
HTTP/1.1 200 OK
(The -s
опция для curl предотвращает отображение статуса загрузки, вызванного передачей curl другому процессу. -n
опция на голове - это количество возвращаемых строк.)
Как определить успех, зависит от вашего определения «действительного». Стандарты HTTP считайте успешным все в диапазоне 200 или 300. Если вы хотите обнаружить на основе этого, вы можете использовать grep
вот так:
$ curl -si https://www.eia.gov/consumption/ | head -n 1 | grep -E 'HTTP/\d\.\d (2|3)\d\d '
При этом используется регулярное выражение для сопоставления любого кода возврата, начинающегося с 2 или 3. Убедитесь, что вы не пытаетесь сопоставить версию протокола HTTP, поскольку она не всегда может быть одинаковой.
Как только вы получите строку, возвращенную curl
и head
, есть бесконечные возможности для обработки, форматирования и возврата результатов в зависимости от того, что вам действительно нужно.