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

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

Конвертируем в PDF

Сентябрь 3, 2013 г.

Есть несколько задач, связанных с конвертацией документов в PDF. Меня интересует перевод из HTML и создание PDF средствами PHP. Конвертировать страницу, отображенную в браузере в PDF. Здесь обычно используют плагины. Это работает до тех пор, пока ...

Читать

Сохранение файла, загруженного на сервер с помощью PHP

Январь 29, 2021 г.

Эта статья о некоторых задачах, возникающих при сохранении файла на сервере, при получении его от пользователя через форму (<input type="file" />). Определимся с требованиями. Технически, решение нужно в виде функции, которая принимает набор ...

Читать

DOMDocument кодировка при сохранении в HTML

Декабрь 20, 2016 г.

PHP поддерживает работу с классом DOMDocument, но есть некоторые особенности, которые требуют внимания. Одна из них - это html кодирование символов, если вы не укажете в заголовке документа мета информацию о кодировке. Рассмотрим пример: [crayon-6a11a9dedfebf694843659/] ...

Читать

Как произвести в PHP HTTP авторизацию в запросе через curl

Сентябрь 17, 2020 г.

Пример кода, выполняющий HTTP авторизацию при запросе через curl. Этот тип авторизации также известен как BASIC. Для формирования правильных заголовков запроса вам потребуется правильно установить две опции curl: CURLOPT_HTTPAUTH и CURLOPT_USERPWD. ...

Читать
 

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

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



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