2013-06-10 23 views
5

Obecnie używam cURL, aby spróbować uzyskać adres URL z przekierowania dla skrobaka witryny. Potrzebuję tylko adresu URL ze strony internetowej. Sprawdzałem na stackoverflow i innych stronach przez ostatnie kilka dni i nie udało się. Kod, którego aktualnie używam, pochodzi z tej witryny:cURL get URL z przekierowania

$url = "http://www.someredirect.com"; 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    $response = curl_exec($ch); 
    preg_match_all('/^Location:(.*)$/mi', $response, $matches); 
    curl_close($ch); 
    echo !empty($matches[1]) ? trim($matches[1][0]) : 'No redirect found'; 

Każda pomoc zostanie bardzo doceniona!

+1

'preg_match_all ('/^Lokalizacja: (. *) $/Mi', $ response, $ matches);', czy próbujesz dopasować 'header ('Location: http: //google.com'); "na przykład? :/ – Prisoner

+0

Tak. Próbujesz przeanalizować lokalizację z nagłówka, ale tag lokalizacji nie jest zwracany w nagłówku. – Josh

+0

W takim przypadku Twój kod działa dobrze dla mnie. – Prisoner

Odpowiedz

4

Spróbuj użyć tego kodu:

function curl_last_url(/*resource*/ $ch, /*int*/ &$maxredirect = null) { 
$mr = $maxredirect === null ? 5 : intval($maxredirect); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    if ($mr > 0) { 
     echo $mr; 
     echo $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 

     $rch = curl_copy_handle($ch); 
     curl_setopt($rch, CURLOPT_HEADER, true); 
     curl_setopt($rch, CURLOPT_NOBODY, true); 
     curl_setopt($rch, CURLOPT_FORBID_REUSE, false); 
     curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); 
     do { 
      curl_setopt($rch, CURLOPT_URL, $newurl); 
      $header = curl_exec($rch); 
      if (curl_errno($rch)) { 
       $code = 0; 
      } else { 
       $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); 
       echo $code; 
       if ($code == 301 || $code == 302) { 
        preg_match('/Location:(.*?)\n/', $header, $matches); 
        $newurl = trim(array_pop($matches)); 
       } else { 
        $code = 0; 
       } 
      } 
     } while ($code && --$mr); 
     curl_close($rch); 
     if (!$mr) { 
      if ($maxredirect === null) { 
       trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); 
      } else { 
       $maxredirect = 0; 
      } 
      return false; 
     } 
     curl_setopt($ch, CURLOPT_URL, $newurl); 
    } 
return $newurl; 

}

7

W danym przypadku, serwer sprawdza niektórych ciągów User-Agent.

Gdy serwer sprawdza ciąg znaków użytkownika, odpowie tylko za pomocą kodu przekierowania o wartości 302, gdy serwer zobaczy "prawidłowy" (zgodnie z serwerem) agent użytkownika. Dowolne "nieprawidłowe" programy użytkownika nie otrzymają odpowiedzi kodu przekierowania stanu 302 lub nagłówka Location:.

W danym przypadku, gdy serwer otrzyma żądanie od "nieprawidłowego" klienta użytkownika, odpowiada on kodem statusu OK, bez tekstu w treści odpowiedzi.

(Uwaga: w poniższym kodzie rzeczywiste adresy przewidziane zostały zastąpione przykłady.)

Powiedzmy, że serwer http://www.example.com „s sprawdza ciąg User-Agent i że http://www.example.com/product/123/ przekierowuje do http://www.example.org/abc.

W PHP rozwiązanie byłoby:

<?php 

$url = 'http://www.example.com/product/123/'; 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0"); // Necessary. The server checks for a valid User-Agent. 
curl_exec($ch); 

$response = curl_exec($ch); 
preg_match_all('/^Location:(.*)$/mi', $response, $matches); 
curl_close($ch); 

echo !empty($matches[1]) ? trim($matches[1][0]) : 'No redirect found'; 

A, wyjście z tego skryptu będzie: http://www.example.org/abc.

+0

Ten adres URL zwraca kod statusu 200 OK OK. – cmt

+0

Tak, zauważyłem to, powinienem był coś powiedzieć. Jeśli nie jest to techniczne przekierowanie, ale nadal kieruje do innej witryny, to w jaki sposób mogę uzyskać żądany URL? – Josh

+0

W linii poleceń możesz zweryfikować swoje przekierowania za pomocą 'curl'. Na przykład, 'curl -IL http: // microsoft.com' najpierw dostarczy kod statusu 301, a następnie 200. Po umieszczeniu adresu URL, który mi dałeś, otrzymuję kod statusu 200 OK na pierwszym adresie URL. – cmt

Powiązane problemy