PEAR :: HTTP / Request2 не следует перенаправлению - PullRequest
2 голосов
/ 11 января 2012

При утилизации я. е. http://baidu.com, скрипт не следует за перенаправлением <meta.. refresh..>. Код, который я запускаю:

require_once 'HTTP/Request2.php';

$request = new HTTP_Request2("http://baidu.com", HTTP_Request2::METHOD_GET);
$request->setConfig(array(
    'adapter' => 'HTTP_Request2_Adapter_Curl',
    'connect_timeout' => 15,
    'timeout' => 30,
    'follow_redirects' => TRUE,
    'max_redirects' => 10,
));

try {
    $response = $request->send();
    if (200 == $response->getStatus()) {

        $html = $response->getBody();
    } else {
        echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
        $response->getReasonPhrase();
    }
} catch (HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
}

print $html;

выходы:

<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>

Есть ли способ заставить его следовать этому перенаправлению, чтобы получить правильный HTML в $ response-> getBody ()?

1 Ответ

1 голос
/ 11 января 2012

Библиотека PEAR выполняет перенаправления HTTP, поскольку они объявлены в заголовке запроса.Пример, который вы показываете в своем вопросе, - это мета-обновление HTML - другой механизм.

Вам нужно будет прочитать ответ на HTTP-запрос, сделанный через PEAR, и проанализировать тег «meta refresh»,затем сделайте второй запрос к URI, который вам удалось вычистить из первого запроса.

Ниже приведен пример функции, которая сделает это из комментария, оставленного в руководстве по PHP.

function getUrlContents($url, $maximumRedirections = null, $currentRedirection = 0)
{
 $result = false;

$contents = @file_get_contents($url);

// Check if we need to go somewhere else

if (isset($contents) && is_string($contents))
{
    preg_match_all('/<[\s]*meta[\s]*http-equiv="?REFRESH"?' . '[\s]*content="?[0-9]*;[\s]*URL[\s]*=[\s]*([^>"]*)"?' . '[\s]*[\/]?[\s]*>/si', $contents, $match);

    if (isset($match) && is_array($match) && count($match) == 2 && count($match[1]) == 1)
    {
        if (!isset($maximumRedirections) || $currentRedirection < $maximumRedirections)
        {
            return getUrlContents($match[1][0], $maximumRedirections, ++$currentRedirection);
        }

        $result = false;
    }
    else
    {
        $result = $contents;
    }
}

return $contents;
}

Этот фрагмент был найден здесь: http://php.net/manual/en/function.get-meta-tags.php

Как я объяснил, вы можете сделать что-то вроде следующего:

//get the url from the meta redirect tag
$url = getUrlContents($site1);
//set up the new request in PEAR
$request = new HTTP_Request2($url, HTTP_Request2::METHOD_GET);

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

...