curl
no parecen tener una función o una opción para obtener el objetivo de redirección, puede ser extraído por medio de varias técnicas:
partir de la respuesta:
Apache puede responder con una página HTML en caso de una redirección 301 (No parece ser el caso con 302).
Si la respuesta tiene un formato similar a:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.xxx.yyy/zzz">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at www.xxx.yyy Port 80</address>
</body></html>
Puede extraer la URL de redirección utilizando DOMXPath
:
$i = 0;
foreach($urls as $url) {
if(substr($url,0,4) == "http") {
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$result = @curl_exec($c);
$status = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);
$results[$i]['code'] = $status;
$results[$i]['url'] = $url;
if($status === 301) {
$xml = new DOMDocument();
$xml->loadHTML($result);
$xpath = new DOMXPath($xml);
$href = $xpath->query("//*[@href]")->item(0);
$results[$i]['target'] = $href->attributes->getNamedItem('href')->nodeValue;
}
$i++;
}
}
Usando CURLOPT_NOBODY
Hay una manera más rápida sin embargo , como señala @gAMBOOKa; Usando CURLOPT_NOBODY
. Este enfoque solo envía una solicitud HEAD
en lugar de GET
(no descarga el contenido real, por lo que debe ser más rápido y más eficiente) y almacena el encabezado de respuesta.
Usando una expresión regular la URL de destino puede ser extraído de la cabecera:
foreach($urls as $url) {
if(substr($url,0,4) == "http") {
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_NOBODY,true);
curl_setopt($c, CURLOPT_HEADER, true);
$result = @curl_exec($c);
$status = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);
$results[$i]['code'] = $status;
$results[$i]['url'] = $url;
if($status === 301 || $status === 302) {
preg_match("@https?://([-\w\.]+)+(:\d+)?(/([\w/_\-\.]*(\?\S+)?)?)[email protected]",$result,$m);
$results[$i]['target'] = $m[0];
}
$i++;
}
}
CURLOPT_NOBODY? – HyderA
Mi programa usa realmente el cuerpo, en aquellos casos en que la URL no es una redirección. Entonces esto no mejoraría las cosas en absoluto. Mi consulta era básicamente sobre si hay un método para extraer el encabezado de ubicación que ahorra la sobrecarga de hacerlo en código PHP. – Stewart
http://stackoverflow.com/questions/1439040/how-can-i-get-the-destination-url-using-curl –