2010-10-31 16 views
24

Actualmente estoy usando curl para completar un formulario, pero después de la finalización de la publicación, el otro script que maneja el formulario está redirigiendo a otra url, ahora quiero obtener la url, para que el script está redireccionando a una variable.cURL, obtener URL de redirección a una variable

Gracias ..

+0

duplicado posible de [¿Cómo puedo obtener la URL de destino usando cURL?] (http://stackoverflow.com/questions/1439040/how-can-i-get-the- destination-url-using-curl) –

Respuesta

32

Se podría utilizar

curl_setopt($CURL, CURLOPT_HEADER, TRUE); 

Y analizar los encabezados de la cabecera location

+0

+1 omitió ese punto :) – Sarfraz

+0

No hay problema, usando los campos de la publicación se enviarán los datos y luego el servidor los redireccionará y a medida que los datos se generen como las respuestas, curl recogerá eso entonces el encabezado de ubicación debería estar allí. – RobertPitt

3

Es posible que desee establecer el CURLOPT_FOLLOWLOCATION a verdadero.

O configure el CURLOPT_HEADER en verdadero y luego use regexp para obtener el encabezado de la ubicación.

+0

También tome nota del modo seguro php con esto, http://www.php.net/manual/en/function.curl-setopt.php#95027 – RobertPitt

8

Aquí obtengo los encabezados http de recursos y luego analizo los encabezados en una matriz $ retVal. Tengo el código para analizar las cabeceras de aquí (http://www.bhootnath.in/blog/2010/10/parse-http-headers-in-php/) También es posible usar http://php.net/manual/en/function.http-parse-headers.php si tiene (PECL pecl_http> = 0.10.0)

 $ch = curl_init(); 
     $timeout = 0; 
     curl_setopt ($ch, CURLOPT_URL, $url); 
     curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
     curl_setopt($ch, CURLOPT_HEADER, TRUE); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
     // Getting binary data 
     $header = curl_exec($ch); 
     $retVal = array(); 
     $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header)); 
     foreach($fields as $field) { 
      if(preg_match('/([^:]+): (.+)/m', $field, $match)) { 
       $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1]))); 
       if(isset($retVal[$match[1]])) { 
        $retVal[$match[1]] = array($retVal[$match[1]], $match[2]); 
       } else { 
        $retVal[$match[1]] = trim($match[2]); 
       } 
      } 
     } 
//here is the header info parsed out 
echo '<pre>'; 
print_r($retVal); 
echo '</pre>'; 
//here is the redirect 
if (isset($retVal['Location'])){ 
    echo $retVal['Location']; 
} else { 
    //keep in mind that if it is a direct link to the image the location header will be missing 
    echo $_GET[$urlKey]; 
} 
curl_close($ch); 
+0

He intentado este código de análisis y no funciona, estaba arrojado varios errores en la parte "explotar()" re: convertir una matriz en una cadena – bitwit

+0

@ nico-limpika Muchas gracias :-) Su código me ayudó mucho. – ravisoni

+0

en 'preg_replace' **'/e el modificador está en desuso ** ¿alguien puede actualizar esta respuesta? –

34

forma fácil de encontrar la URL redirigida (si no lo hace quieren saber de antemano)

$last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
+3

Es 'CURLINFO_REDIRECT_URL' – Sparky

+0

No encuentro CURLINFO_REDIRECT_URL aquí http: // www.php.net/manual/en/function.curl-getinfo.php –

+1

Pero lo encuentro aquí http://php.net/ChangeLog-5.php !!! CURLINFO_REDIRECT_URL se agrega a 5.3.7, pero no está documentado. Pero desde la fuente asumo que este es el (primer) valor de URL de redireccionamiento en caso de que Curl Call no esté utilizando la redirección automática. Entonces sabríamos cuál es la siguiente URL en caso de que hubiéramos habilitado la redirección. Gracias @Sparky por forzarme a cavar. –

Cuestiones relacionadas