php - ¿Cómo paso las cookies en un redireccionamiento de CURL?
redirect (4)
imagine el siguiente escenario: 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.
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! ;
Para responderme a mí mismo, así es como lo hice:
Toma el código de encabezado-http-estado. Si se redirecciona, extrae la nueva ubicación y redirige manualmente. De lo contrario, elimine el encabezado y muestre 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;
}
También puede consultar esta biblioteca: http://github.com/shuber/curl
para indicarle a php en curl session que use cookies, debes establecer 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 agregará en CURLOPT_COOKIEJAR y esas cookies se llevarán a todas las ubicaciones configurando CURLOPT_COOKIEFILE
Esta es una vieja pregunta, pero tuve el mismo problema, así que google me llevó hasta aquí. Finalmente, logré resolverlo. Al pasar una cadena vacía "" para establecer CURLOPT_COOKIEFILE usando curl_setopt se resolverá el problema:
curl_setopt($ch, CURLOPT_COOKIEFILE, "");
Ver la sección CURLOPT_COOKIEFILE
de http://curl.haxx.se/libcurl/c/curl_easy_setopt.html