php cookies redirect curl

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; }



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