2009-09-22 14 views
17

imagine la situación siguiente: abro una conexión CURL y paso algunos XML-Logindata vía POST. El servidor responde con un redireccionamiento 302, donde se establecen las cookies de sesión y me redirige a la siguiente página de "bienvenida". Si habilito FOLLOWLOCATION, las cookies establecidas en la página de redirección se pierden y la página de bienvenida falla con un mensaje de "sesión expirada". Si deshabilito FOLLOWLOCATION, no me redirigen (obviamente) y obtengo una página HTML con "la página se ha movido a otra ubicación" con un enlace que me lleva a la página de bienvenida. Esto funciona cuando las cookies están configuradas, pero necesito seguir el redireccionamiento e ir directamente a la página de bienvenida.¿Cómo paso las cookies en un redireccionamiento de CURL?

Entonces, ¿cómo mantengo las cookies para que estén configuradas correctamente?

Este es mi código hasta ahora:

$ch = curl_init('https://www.example.com/login'); 

curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_POSTFIELDS, '<some xml data>'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml; charset=UTF-8")); 

curl_exec($ch); 
curl_close($ch) 

Gracias por cualquier ayuda! ;

Respuesta

24

Esta es una vieja pregunta, pero tuve el mismo problema, por lo que google me llevó hasta aquí. Finalmente, logré resolverlo. Al pasar una cadena vacía "" para fijar CURLOPT_COOKIEFILE usando curl_setopt va a resolver el problema:

curl_setopt($ch, CURLOPT_COOKIEFILE, ""); 

Véase la sección de CURLOPT_COOKIEFILEhttp://curl.haxx.se/libcurl/c/curl_easy_setopt.html

3

Para responder a mí mismo, esto es cómo lo hice:

Agarra el código de cabecera-http-status. Si se redirecciona, extrae la nueva ubicación y redirige manualmente. De lo contrario eliminar la cabecera y la salida de los contenidos:

$response = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 

if($info['http_code'] == 301 || $info['http_code'] == 302) { // redirect manually, cookies must be set, which curl does not itself 

    // extract new location 
    preg_match_all('|Location: (.*)\n|U', $response, $results); 
    $location = implode(';', $results[1]); 

    // redirect manually 
    header("Location: $location"); 
    exit; 

} else { // no redirect, remove header and output directly 

    $response = substr_replace($response, '', 0, strpos($response, '<', 0)); 

    echo $response; 

} 
+0

Así que para ser claros, estás ya no se configura CURLOPT_FOLLOWLOCATION? – bhollis

+1

Derecha: lo compruebo manualmente, si es un redireccionamiento o no. – acme

6

instruir php en sesión de rizo de utilizar cookies se debe configurar dos opciones:

curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');// set where cookies will be stored 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');// from where it will get cookies 

por lo que cada cookie se adjunta en CURLOPT_COOKIEJAR y esos cookie ser transportado en cada lugar mediante el establecimiento de CURLOPT_COOKIEFILE

+0

No funcionó cuando se siguen redirecciones. –

Cuestiones relacionadas