Как получить 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 ]] ).

Написать комментарий

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

Извлекаем атрибуты из шот/html кода

Апрель 23, 2017 г.

Предлагаю код очень простой функции-парсера атрибутов из кусочков html кода. Основное назначение - разбирать текст short-codes. На входе: html код или shortcode. На выходе: имя тега и набор атрибутов. Если ничего подходящего не найдено - получим ...

Читать

Антиспам с использованием Javascipt для WordPress, обходимся без Captcha

Апрель 12, 2013 г.

О сути метода я рассказываю здесь - Бегство от спама. Для работы понадобится hook на новые комментарии - pre_comment_approved, который мы объявим в файле темы - function.php. Если в вашей теме нет такого файла - создайте :). Нужно модифицировать всего ...

Читать

 

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

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



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