2010-07-13 22 views
7

Estoy buscando para CURAR una URL y realizar un seguimiento de cada URL que atraviesa. Por alguna razón, no puedo lograr esto sin hacer recursivas llamadas a CURL que no son ideales. Tal vez me falta una opción fácil. ¿Pensamientos?PHP: cURL y realizar un seguimiento de todas las redirecciones

$url = "some url with redirects"; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, false); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0"); 

$html = curl_exec($ch); 
$info = array(); 
if(!curl_errno($ch)) 
{ 
     $info = curl_getinfo($ch); 
     echo "<pre>"; 
     print_r($info); 
     echo "</pre>"; 
} 

y obtener una respuesta como esta

Array 
(
    [url] => THE LAST URL THAT WAS HIT 
    [content_type] => text/html; charset=utf-8 
    [http_code] => 200 
    [header_size] => 1942 
    [request_size] => 1047 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 2 <---- I WANT THESE 
    [total_time] => 0.799589 
    [namelookup_time] => 0.000741 
    [connect_time] => 0.104206 
    [pretransfer_time] => 0.104306 
    [size_upload] => 0 
    [size_download] => 49460 
    [speed_download] => 61856 
    [speed_upload] => 0 
    [download_content_length] => 49460 
    [upload_content_length] => 0 
    [starttransfer_time] => 0.280781 
    [redirect_time] => 0.400723 
) 

Respuesta

9

Usted tiene

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

Esto significa que se curvan seguirá redirecciones y devolver sólo la última página sin cabecera Location.

Para seguir ubicación de forma manual:

function getWebPage($url, $redirectcallback = null){ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_NOBODY, false); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0"); 

    $html = curl_exec($ch); 
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    if ($http_code == 301 || $http_code == 302) { 
     list($httpheader) = explode("\r\n\r\n", $html, 2); 
     $matches = array(); 
     preg_match('/(Location:|URI:)(.*?)\n/', $httpheader, $matches); 
     $nurl = trim(array_pop($matches)); 
     $url_parsed = parse_url($nurl); 
     if (isset($url_parsed)) { 
      if($redirectcallback){ // callback 
       $redirectcallback($nurl, $url); 
      } 
      $html = getWebPage($nurl, $redirectcallback); 
     } 
    } 
    return $html; 
} 

function trackAllLocations($newUrl, $currentUrl){ 
    echo $currentUrl.' ---> '.$newUrl."\r\n"; 
} 

getWebPage('some url with redirects', 'trackAllLocations'); 
+0

¿Cuál sería '$ redirectcallback' como ejemplo? – ChristoKiwi

2

¿Puedo hacer una recomendación ...

preg_match('/(Location:|URI:)(.*?)\n/', $httpheader, $matches); 

cambio de la expresión regular a /(Location:|URI:)(.*?)\n/Por eso es insensible a mayúsculas y minúsculas. Noté que hay algunos sitios/lugares que usan la ubicación: donde la letra L es minúscula.

Solo un pensamiento para ayudar a aquellos que se preguntan por qué a veces no funciona ... investiguen eso.

2

Con libcurl, puede utilizar la variable CURLINFO_REDIRECT_URL getinfo para averiguar la URL que tendría redirigidos a si estaba habilitado. Esto permite que los programas atraviesen fácilmente los redireccionamientos.

Este enfoque es mucho mejor y más fácil que el análisis de los encabezados Location: que los otros han sugerido aquí, ya que su código debe reconstruir rutas relativas, etc. CURLINFO_REDIRECT_URL lo soluciona automáticamente.

El PHP/CURL unión añadieron support for this feature en PHP 5.3.7:

$url = curl_getinfo($ch, CURLINFO_REDIRECT_URL) 

la confirmación de que esta fijo: http://lxr.php.net/history/PHP-MASTER/ext/curl/interface.c#599d9134 (abril de 2011)

+0

Oye, el enlace ya no funciona. ¿Se ha implementado esto? De ser así, ¿sabe cómo usarlo desde PHP? –

+1

Estoy agradecido por esta idea, me gusta mucho más que alternar manualmente los códigos de estado y encontrar la URL de redireccionamiento. –

+0

Mierda, acabo de darme cuenta de quién eres. –

Cuestiones relacionadas