Php код ответа сервера

Используя нижеприведенный код вы сможете проверить, существует сайт или нет. Также можно проверить, есть ли на сайте редирект.

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

$toCheckURL = "http://google.com" ; // Домен для проверки

// поработаем с CURL

curl_setopt( $ch , CURLOPT_URL, $toCheckURL );

curl_setopt( $ch , CURLOPT_HEADER, true);

curl_setopt( $ch , CURLOPT_NOBODY, true);

curl_setopt( $ch , CURLOPT_RETURNTRANSFER, true);

curl_setopt( $ch , CURLOPT_FOLLOWLOCATION, true);

curl_setopt( $ch , CURLOPT_MAXREDIRS, 10); // разрешаем только 10 редиректов за раз во избежание бесконечного цикла

$data = curl_exec( $ch );

$http_code = curl_getinfo( $ch , CURLINFO_HTTP_CODE); // Получаем HTTP-код

$new_url = curl_getinfo( $ch , CURLINFO_EFFECTIVE_URL);

// Массив возможных HTTP статус кодовв

$codes = array (0=> ‘Domain Not Found’ ,

101=> ‘Switching Protocols’ ,

203=> ‘Non-Authoritative Information’ ,

205=> ‘Reset Content’ ,

206=> ‘Partial Content’ ,

300=> ‘Multiple Choices’ ,

301=> ‘Moved Permanently’ ,

304=> ‘Not Modified’ ,

307=> ‘Temporary Redirect’ ,

400=> ‘Bad Request’ ,

402=> ‘Payment Required’ ,

405=> ‘Method Not Allowed’ ,

406=> ‘Not Acceptable’ ,

407=> ‘Proxy Authentication Required’ ,

408=> ‘Request Timeout’ ,

411=> ‘Length Required’ ,

412=> ‘Precondition Failed’ ,

413=> ‘Request Entity Too Large’ ,

414=> ‘Request-URI Too Long’ ,

415=> ‘Unsupported Media Type’ ,

416=> ‘Requested Range Not Satisfiable’ ,

417=> ‘Expectation Failed’ ,

500=> ‘Internal Server Error’ ,

501=> ‘Not Implemented’ ,

502=> ‘Bad Gateway’ ,

503=> ‘Service Unavailable’ ,

504=> ‘Gateway Timeout’ ,

505=> ‘HTTP Version Not Supported’ );

// Ищем совпадения с нашим списком

if (isset( $codes [ $http_code ])) <

Читайте также:  Asrock h61m dgs bios

echo ‘Сайт вернул ответ: ‘ . $http_code . ‘ — ‘ . $codes [ $http_code ]. ‘
‘ ;

preg_match_all( "/HTTP/1.[1|0]s(d<3>)/" , $data , $matches );

array_pop ( $matches [1]);

if ( count ( $matches [1]) > 0) <

// Идем дальше по списку, чтобы посмотреть, какие мы еще статус коды получили

foreach ( $matches [1] as $c ) <

echo $c . ‘ — ‘ . $codes [ $c ]. ‘
‘ ;

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

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

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

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

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

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

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

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

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

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

Читайте также:  Lim sin x при x бесконечность

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

Необходимо послать GET/POST запрос и получить код ответа, полученное содержание роли не играет. Возможно ли такое реализовать? Желательно без curl.

2 ответа 2

Получаем только заголовки и проверяем код ответа:

Хотя особой разницы с получением полного ответа нет, на сервер придёт обычный HTTP/1.0 запрос.

Для отправки POST запросов можно curl использовать и получать из ответа http-status. К тому же при POST обычно и данные посылают.

Как заметил @BOPOH, через get_headres и доп. заголовки можно передавать, в том числе установить метод HEAD или POST. Пример с методом POST:

stackoveflow ругнулся что string(28) "HTTP/1.1 411 Length Required" должны быть POST данные, на некоторых ресурсах с пустыми POST-даннымии отвечает 200.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *