Curl и ручной редирект

Тема в разделе "PHP программирование", создана пользователем VadikV, 10 ноя 2010.

  1. VadikV

    VadikV Member

    Регистрация:
    10 ноя 2010
    Сообщения:
    17
    Симпатии:
    0
    Есть адрес страницы продукта (прописан в скрипте).
    Если включить CURLOPT_FOLLOWLOCATION, то код страницы нормально получается.
    Если без CURLOPT_FOLLOWLOCATION делать редирект вручную - редирект проходит нормально до конца, но в конце выдается пустая страница. Замучался уже.
    Зачем это нужно? Хост не дает использовать CURLOPT_FOLLOWLOCATION и исправить это нельзя.
    Вот исходный код скрипта:
    Код (PHP):
        function redirect_exec($ch)
    {
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $data = curl_exec($ch);
    $info = curl_getinfo($ch);
    $http_code = $info['http_code'];
    if ($http_code == 301 || $http_code == 302 || $http_code == 303)
    {
    list($header) = explode("\r\n\r\n", $data, 2);
    $matches = array();
    preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
    $url = trim(array_pop($matches));
    $url_parsed = parse_url($url);
    if (isset($url_parsed['host']))
    {
    curl_setopt($ch, CURLOPT_REFERER, $info['url']);
    curl_setopt($ch, CURLOPT_URL, $url);
    return redirect_exec($ch);
    }
    }

    elseif($http_code == 200)
    {
    $matches = array();
    preg_match('/(<meta http-equiv=)(.*?)(refresh)(.*?)(url=)(.*?)[\'|"]\s*>/', strtolower($data), $matches);
    $url = trim(array_pop($matches));
    $url_parsed = parse_url($url);
    if (isset($url_parsed['host'])) {
    curl_setopt($ch, CURLOPT_REFERER, $info['url']);
    curl_setopt($ch, CURLOPT_URL, $url);
    return redirect_exec($ch);
    }
    }

    return $info['url'];
    }

    $url = 'http://www.urbanoutfitters.com/urban/catalog/productdetail.jsp?id=17550583&navAction=jump&isProduct=true&parentid=MORE%20IDEAS&isProduct=true&cross-sell=true&guide-bn=true';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    //          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.5 (build 01399))');
    curl_setopt($ch, CURLOPT_URL, $url);

    $s = @curl_exec($ch);
    $info = curl_getinfo($ch);
    $http_code = $info['http_code'];
    if ($http_code == 301 || $http_code == 302 || $http_code == 303)
    {
    $url = redirect_exec($ch);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_URL, $url);
    $s = @curl_exec($ch);
    }

    curl_close($ch);
    Если раскомментировать строку curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); то $s будет содержать код страницы.
    Если оставить, как есть - $s пустая в конце.
    Подскажите.
     
  2. nws

    nws Гость

    из header'a получи location и перейди по нему
     
  3. VadikV

    VadikV Member

    Регистрация:
    10 ноя 2010
    Сообщения:
    17
    Симпатии:
    0
    Дело в том, что мой редирект отрабатыевает все переходы нормально.
    Конечный и начальный адрес совпадают. В процессе редиректа он чего-то там делает, а что я не могу понять. Уже и логи все сравнивал - нет разницы между ручным и автоматическим.
    Где-то я что-то упустил....
    Куки уже пробовал руками обрабатывать - тоже не помогает. Если есть отладчик - попробуйте пошагать. Я пользуюсь NuSphere PhpED.
    У curl есть режим отладки, где он все в лог-файл пишет. Лог для ручного и автоматического редиректа одинаковый :lovecodeby:
     
  4. nws

    nws Гость

    скачай плагин для FF HttpFox там увидишь что передается серверy и его ответы
     
  5. VadikV

    VadikV Member

    Регистрация:
    10 ноя 2010
    Сообщения:
    17
    Симпатии:
    0
    Есть этот плагин. По нему и анализировал логи работы. Мои логи полностью совпадают с этими. Разница только в параметрах, которые время хранят ну и в sessionid.
     
Загрузка...
Похожие Темы - Curl ручной редирект
  1. sasha465
    Ответов:
    0
    Просмотров:
    3.558
  2. vital
    Ответов:
    0
    Просмотров:
    1.587
  3. admin
    Ответов:
    1
    Просмотров:
    4.725

Поделиться этой страницей