PHP - Использование cURL для получения окончательного статуса URL после перенаправления - PullRequest
0 голосов
/ 24 октября 2018

Я использую эту функцию для получения статуса окончательного URL-адреса после некоторых возможных перенаправлений:

function getUrlStatus($url) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
        curl_exec($ch);

        $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $redirectURL = curl_getinfo($ch, CURLINFO_REDIRECT_URL);
        curl_close($ch);

        if($httpStatus >= 300 && $httpStatus < 400) {
            getUrlStatus($redirectURL);
        } else {
            return $httpStatus;
        }
    }

Если первый проверяемый URL-адрес не перенаправлен, он работает нормально и отображает статус, но еслипроверяется перенаправленный URL-адрес (поэтому функция getUrlStatus вызывается рекурсивно), в результате получается NULL:

var_dump(getUrlStatus($url));   //   NULL

Я выполняю эту проверку для нескольких URL-адресов и всехони имеют статус 307, поэтому все они снова вызывают функцию, поэтому отображается NULL.Посоветуйте пожалуйста что я делаю не так.Спасибо!

1 Ответ

0 голосов
/ 24 октября 2018

Вы ищете CURLOPT_FOLLOWLOCATION

TRUE to follow any "Location: " header that the server sends as part of the HTTP header (note this is recursive, PHP will follow as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set). от: http://docs.php.net/manual/da/function.curl-setopt.php

Если вы не планируете использовать опцию CURLOPT_FOLLOWLOCATION, вы должны убедиться, что выПроанализируйте заголовки правильно, чтобы получить статус.Из http://php.net/manual/en/function.curl-getinfo.php вы можете увидеть CURLINFO_HTTP_CODE - The last response code.(...) , что означает: может быть более одного кода состояния.то есть с http://airbrake.io/login отправляется два:

HTTP/1.1 301 Moved Permanently
(...)

HTTP/1.1 200 OK
(...)

Это означает, что будет возвращено только 200, и если вы хотите получить ЛЮБОЙ результат, ваша функция должна выглядеть следующим образом:

 if($httpStatus >= 300 && $httpStatus < 400) {
     return getUrlStatus($redirectURL);
 } else {
     return $httpStatus;
 }
...