Location в CURL

Добрый день. Очень часто при написании скриптов авторизации встает проблема с перенаправлением. Например вы отправляете POST запрос на авторизацию и в ответ ,при удачной автоизации, мы молучаем следующее:


HTTP/1.1 302 Found Date: Fri, 16 Jul 2010 10:43:07 GMT Server: Apache/2 Expires: Mon, 26 Jul 1997 05:00:00 GMT Last-Modified: Fri, 16 Jul 2010 10:43:07 GMT Cache-Control: post-check=0, pre-check=0 Pragma: no-cache Location: /rus++/options/ Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 20 Content-Type: text/html; charset=windows-1251



Итак при успешной автоизации скрипт нас должен отправить по адресу site.ru/rus++/options/ и такpих перенаправлений может быть целое множество. На помощь вам придет, функция на Php, которая парсит выдачу и перенаправляет нас куда нужно. Автор функции не Я, выдрал из одного забугорного даижка, но иногда очень выручает.



function curl_redir_exec($ch)
{
    static $curl_loops = 0;
    static $curl_max_loops = 20;

      if ($curl_loops   >= $curl_max_loops)
      {
         $curl_loops = 0;
        return FALSE;
      }

    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $data = curl_exec($ch);
    list($header, $data) = explode("nn", $data, 2);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if ($http_code == 301 || $http_code == 302)
       {
        $matches = array();
        preg_match('/Location:(.*?)n/', $header, $matches);
         $url = @parse_url(trim(array_pop($matches)));
        if (!$url)
       {
        //couldn't process the url to redirect to
        $curl_loops = 0;
        return $data;
        }
       $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));

       if (!$url['scheme'])
        $url['scheme'] = $last_url['scheme'];

       if (!$url['host'])
        $url['host'] = $last_url['host'];

       if (!$url['path'])
        $url['path'] = $last_url['path'];
       $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');

       curl_setopt($ch, CURLOPT_URL, $new_url);
       //debug('Redirecting to', $new_url);
       return curl_redir_exec($ch);
     }
       else
                    {
        $curl_loops=0;
        return $data;
        }
}




Рекомендуем почитать

 

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


Ваше имя:


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


Введите: Картинка