Как получить HTTP код ответа удаленного веб-сервера из PHP?

Когда требуется получить HTTP код для заданной URL, то вы наверняка воспользуетесь PHP функцией get_headers($url). Дальше я расскажу о разных подводных камнях и возникающих попутных проблемах.

В первом приближении задача решается элементарно. У вас есть URL, вы запрашиваете только заголовки, т.к. вам не нужен сам документ. В заголовках можно найти и пропарсить стандартный ответ сервера, чтобы извлечь код ответа.

Скорее всего, вы действительно получите желаемое, но не всегда. Потому перейдем к рассмотрению наиболее частых коллизий.

Домен не существует

Да такое бывает, когда введенный адрес не существует. Вернее не адрес, а доменное имя сайта. Запрос посылать некуда, а вы увидите (если не отключили вывод php warnings) что то вроде следующего:

PHP вернет пустые заголовки, из которых ничего не извлечь. Как можно обработать эту ситуацию?

Тут вы уже не увидите сообщений от PHP, а в случае невозможности определить адрес сервера —  будет установлено какое то кастомное значение вместо HTTP кода, чтобы иметь возможность его обработать дальше.

Доменные имена с использованием национальных наборов символов.

Функция get_headers не настолько умна, чтобы переводить ваш http://россия.рф в http://xn--h1alffa9f.xn--p1ai200.

Если вы попытаетесь запросить заголовки без перевода в нужный вид, то прошлый пример выдаст вам загадочное ‘no response’. В то время как браузер без проблем откроет сайт, т.к. умеет переводить доменные имена, в которых используются местные национальные наборы символов, отличные от латиницы.

Для конвертации используем свободно распространяемую библиотеку idna_convert. Качайте архив, распаковывайте и подключайте в ваш код.

Теперь пример выглядит следующим образом:

Ошибки с SSL сертификатами

Если вы делаете запросы к https:// сайтам, то рано или поздно увидите ошибки вроде : «SSL error SSL3_GET_SERVER_CERTIFICATE:certificate verify failed». Ничего страшного, сейчас мы укажем PHP, что не время проводить проверки SSL сертификатов.

Воспользуемся контекстом потока, для задания необходимых параметров. Перед кодом нужно добавить:

С 7-й версии PHP контекст можно передать как третий параметр get_headers(). Для этого его нужно создать функцией stream_context_create ([ array $options [, array $params ]] ).

Мало букафф? Читайте есчо !

Импортируем изображения через wysiwyg

Декабрь 27, 2014 г.

Речь пойдет о небольшой задачке, которая постоянно всплывает при переносе данных со старых сайтов на новые. Т.е. новый сайт уже готов, но есть старый, на котором какое то количество статей, требующих аккуратного переноса, при чем они содержат картинки. ...

Читать

Функция для локализации изображения при экспорте статьи

Февраль 29, 2016 г.

За многолетнюю практику работы с Drupal, я накопил целую библиотеку вспомогательных функций. Функция, описываемая в этой статье, используется для копирования ...

Читать

Сериализация HTML строки из PHP в JS

Август 7, 2019 г.

Рассмотрим разновидность задачи по сериализации данных - мне нужно было сохранить HTML код в атрибуте контейнера, чтобы вставлять его по определенному событию в верстку. Можно было сразу вставить кусочки HTML кода в документ и далее манипулировать ...

Читать

Отправить PUT запрос через cUrl в PHP

Май 19, 2021 г.

Делюсь примером кода, который отправляет PUT запрос через CURL. Все работает точно также как для POST запроса, с небольшими отличиями в настройках: [crayon-69e816a61a655937981591/] Надеюсь, этот пример сэкономит вам время :)

Читать
 

Комментарии к «Как получить HTTP код ответа удаленного веб-сервера из PHP?»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: