dentro - php curl timeout
¿Cómo puedo obtener la URL de destino usando cURL? (8)
El nuevo destino para un redireccionamiento 302 está ubicado en el campo de encabezado http "ubicación". Ejemplo:
HTTP/1.1 302 Found
Date: Tue, 30 Jun 2002 1:20:30 GMT
Server: Apache
Location: http://www.foobar.com/foo/bar
Content-Type: text/html; charset=iso-8859-1
Solo grep it con una expresión regular.
Para incluir toda la información del encabezado HTTP, inclúyala en el resultado con la opción curl CURLOPT_HEADER . Establecerlo con:
curl_setopt($c, CURLOPT_HEADER, true);
Si simplemente desea que Curl siga la redirección, utilice CURLOPT_FOLLOWLOCATION :
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
De todos modos, no deberías usar el nuevo URI porque HTTP Statuscode 302 es solo un redireccionamiento temporal .
¿Cómo puedo obtener la URL de destino usando cURL cuando el código de estado HTTP es 302?
<?PHP
$url = "http://www.ecs.soton.ac.uk/news/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
$status_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
if($status_code=302 or $status_code=301){
$url = "";
// I want to to get the destination url
}
curl_close($ch);
?>
En respuesta al comentario del usuario437797 sobre la respuesta de Tamik Soziev (desafortunadamente no tengo la reputación de comentar directamente):
CURLINFO_EFFECTIVE_URL funciona bien, pero para que funcione como op quiere también debes establecer CURLOPT_FOLLOWLOCATION en TRUE, por supuesto. Esto es porque CURLINFO_EFFECTIVE_URL devuelve exactamente lo que dice, la url efectiva que termina siendo cargada. Si no sigue los redireccionamientos, esta será su url solicitada; si sigue los redireccionamientos, será la url final a la que se redireccionará.
Lo bueno de este enfoque es que también funciona con múltiples redireccionamientos, mientras que al recuperar y analizar el encabezado HTTP usted mismo puede tener que hacer eso varias veces antes de que la url de destino final quede expuesta.
También tenga en cuenta que el número máximo de redirecciones que curl sigue se puede controlar a través de CURLOPT_MAXREDIRS. Por defecto es ilimitado (-1) pero esto puede ocasionarle problemas si alguien (tal vez intencionalmente) configuró e interminablemente un bucle de redirección para alguna url.
Esta es una forma de obtener todos los encabezados devueltos por una solicitud http curl, así como el código de estado y una matriz de líneas de encabezado para cada encabezado.
$url = ''http://google.com'';
$opts = array(CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_FOLLOWLOCATION => true);
$ch = curl_init();
curl_setopt_array($ch, $opts);
$return = curl_exec($ch);
curl_close($ch);
$headers = http_response_headers($return);
foreach ($headers as $header) {
$str = http_response_code($header);
$hdr_arr = http_response_header_lines($header);
if (isset($hdr_arr[''Location''])) {
$str .= '' - Location: '' . $hdr_arr[''Location''];
}
echo $str . ''<br />'';
}
function http_response_headers($ret_str)
{
$hdrs = array();
$arr = explode("/r/n/r/n", $ret_str);
foreach ($arr as $each) {
if (substr($each, 0, 4) == ''HTTP'') {
$hdrs[] = $each;
}
}
return $hdrs;
}
function http_response_header_lines($hdr_str)
{
$lines = explode("/n", $hdr_str);
$hdr_arr[''status_line''] = trim(array_shift($lines));
foreach ($lines as $line) {
list($key, $val) = explode('':'', $line, 2);
$hdr_arr[trim($key)] = trim($val);
}
return $hdr_arr;
}
function http_response_code($str)
{
return substr(trim(strstr($str, '' '')), 0, 3);
}
Puedes usar:
echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
Tienes que tomar el encabezado de la ubicación para la URL redirigida.
Un poco anticuado de una respuesta, pero quería mostrar un ejemplo completo de trabajo, algunas de las soluciones que hay son piezas:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //set url
curl_setopt($ch, CURLOPT_HEADER, true); //get header
curl_setopt($ch, CURLOPT_NOBODY, true); //do not include response body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //do not show in browser the response
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //follow any redirects
curl_exec($ch);
$new_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); //extract the url from the header response
curl_close($ch);
Esto funciona con redirecciones como 301 o 302, sin embargo en 404 solo devolverá la url original solicitada (ya que no se encontró). Esto se puede utilizar para actualizar o eliminar enlaces de su sitio. Esta era mi necesidad de todos modos.
Utilice curl_getinfo($ch)
, y el primer elemento ( url
) indicará la URL efectiva.
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE); // We''ll parse redirect url from header.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); // We want to just get redirect url but not to follow it.
$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'';