За последние 24 часа нас посетили 65603 программиста и 1627 роботов. Сейчас ищут 1017 программистов ...

СРОЧНО помогите с 301 Moved Permanently.

Тема в разделе "PHP для новичков", создана пользователем Priler, 5 мар 2013.

  1. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Пытаюсь загрузить/спарсить страницу с помощью fopen(); но часто возвращается ответ 301 Moved Permanently
    Помогите пожалуйста как сделать так что бы скрипт узнавал если такой ответ приходит и загружал уже новый адрес.
    Спасибо за помощь заранее.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    В курле вроде есть опция перехода по редиректам
     
  3. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    igordata мне не переход нужен а новый URL помоги пожалуйста, мне надо спарсить по новому урлу если была 302 ошибка
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вам же ответили уже. в курле действительно есть опция отвечающая за следование редиректам которые приходят в ответ. если она отключена - курл завершится неудачей но в информации о сессии будет указан соответствующий новый адрес. когда опция включена то автоматом будет получен ресурс по новому адресу.

    если вам нужен именно новый адрес - разбирайте ответ курла при отключенном фоловинге редиректов
    если нужено содержимое с нового адреса - включите соответствующую опцию и наслаждайтесь
     
  5. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Ganzal, я не разбираюсь вообще в Курл, мне просто срочно очень нужно решить проблему с 301 ошибкой.
    Помогите пожалуйста кодом.
    Заранее спасибо!
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    регистр с точностью до наоборот - cURL
    срочно за деньги. пробуйте сами и поможем отредактировать код. там три строки в простом случае. чего вы боитесь-то?
     
  7. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Ganzal, я не боюсь, я не знаю что писать, попробую - отпишусь, если что вы поможете )))))
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    угрожаете?)))) пишите, там три действия всего. слабо себе представляю трудности))) ну разве что библиотека не включена)))
     
  9. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Нет не угрожаю)
    Откопал тут такую штуку
    Код (Text):
    1. $ch = curl_init();
    2. curl_setopt($ch, CURLOPT_URL, $site);
    3. curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Сколько сек. ждать ответ сервреа
    4. $site = curl_redir_exec($ch);
    5. $site = curl_exec($ch);
    6. curl_close($ch);
    7.  
    8. function curl_redir_exec($ch)
    9.   {
    10.   static $curl_loops = 0;
    11.   static $curl_max_loops = 20;
    12.   if ($curl_loops >= $curl_max_loops)
    13.     {
    14.     $curl_loops = 0;
    15.     return false;
    16.     }
    17.   curl_setopt($ch, CURLOPT_HEADER, true);
    18.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    19.   $data = curl_exec($ch);
    20.   list($header, $data) = explode("\n\n", $data, 2);
    21.   $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    22.  
    23.   if ($http_code == 301 || $http_code == 302)
    24.     {
    25.     $matches = array();
    26.     preg_match('/Location:(.*?)\n/', $header, $matches);
    27.     $url = @parse_url(trim(array_pop($matches)));
    28.     if (!$url)
    29.       {
    30.       $curl_loops = 0;
    31.       return $data;
    32.       }
    33.     $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
    34.    
    35.     if (!$url['scheme'])
    36.       $url['scheme'] = $last_url['scheme'];
    37.     if (!$url['host'])
    38.       $url['host'] = $last_url['host'];
    39.     if (!$url['path'])
    40.       $url['path'] = $last_url['path'];
    41.     $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
    42.     //echo 'Пожалуйста, укажите следующий URL для правильного отображения контенте - '.$new_url;
    43.     curl_setopt($ch, CURLOPT_URL, $new_url);
    44.     return curl_redir_exec($ch);
    45.     }
    46.   else
    47.     {
    48.     $curl_loops = 0;
    49.     return $data;
    50.     }
    51.   }
    Только не пойму где тут что, не зная команд сложно разобраться, но все таки усиленно копаюсь

    Добавлено спустя 11 минут 43 секунды:
    Ganzal, я правильно понял так надо да?

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $site);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Сколько сек. ждать ответ сервреа
    $page = curl_exec($ch);
    $matches = array();
    preg_match('/Location:(.*?)\n/', $header, $matches);
    $url = @parse_url(trim(array_pop($matches)));
    $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']:'');

    echo $new_url;
    curl_close($ch);

    Добавлено спустя 1 минуту 19 секунд:
    Не работает..
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нихрена себе вы откопали)))))

    CURLOPT_FOLLOWLOCATION и вот этого камуфляжа можно избежать))))
     
  11. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Ganzal, а что такого я откопал?
    Стойте не подсказывайте, я почти докопался до истины

    Добавлено спустя 5 минут 1 секунду:
    Ура заработало!!!!
    Теперь я получаю html код страницы (углубленного?) редиректа :D)))))))!!!!
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я не знаю автора но он зачем-то очень сильно усложнил алгоритм. у меня даже нет идей зачем нужно было так делать. очень многое из написанного решается другими функциями. видимо, человек участвовал в конкурсе не применения стандартных методик ))))

    $ch = curl_init(); // действие раз. объявили ресурс
    curl_setopt_array( $ch, array( // действие два. установили опции.
    CURLOPT_FOLLOWLOCATION => true, // следовать перенаправлениям...
    CURLOPT_MAXREDIRS => 10, // ... но не более 10 раз
    CURLOPT_RETURNTRANSFER => true, // смешная третья опция
    CURLOPT_TIMEOUT => 10, // Сколько сек. ждать ответ сервреа (комментарий взят из вашего сообщения, порядок букв сохранен)
    CURLOPT_URL => $site // вот этой строки можно избегать инициализируя сразу с адресом. но вам проще иметь ее тут.
    )); // конец второго действия
    $page = curl_exec($ch); // действие третье и последнее. выполняем запрос и подзапросы (если необходимо) единожды вернув содержимое запрошенного ресурса в случае успеха.

    Добавлено спустя 1 минуту 57 секунд:
    ну вот эта конструкция выписала диагноз листингу =)
    Код (Text):
    1. $site = curl_redir_exec($ch);
    2. $site = curl_exec($ch);
     
  13. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Спасибо за объяснения! Все окей) Не подскажите хороший и понятный учебник на русском по cURL?
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да в мане php и читайте. ничего особенного в функциональном применении этой библиотеки не нужно знать - все само за себя говорит. вот консольное применение это минное поле в своем роде)))
    удачи!)
     
  15. Priler

    Priler Активный пользователь

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    :) Ну почитаем тогда

    Добавлено спустя 2 минуты 26 секунд:
    Не подскажите как решить проблему с иероглифами?
    У меня скрипт в UTF-8 а загружаемая страница в windows-1251, как перекодировать? пробую iconv но не помогает

    Добавлено спустя 8 минут 43 секунды:
    Все разобрался сам ))))
    Код (Text):
    1. if($charset['2']!='' and $charset['2']!='utf-8') {
    2.     $html=iconv($charset['2'], 'utf-8', $html);
    3.     echo 'Конвертировано из '.$charset['2'].' в utf-8';
    4. }