2009-09-22 16 views
17

Wyobraź sobie następujący scenariusz: Otwieram połączenie CURL i przekazuję trochę XML-Logindata przez POST. Serwer odpowiada za pomocą przekierowania 302, w którym ustawione są pliki cookie sesji i przekierowuje mnie na następującą stronę "witamy". Jeśli włączę FOLLOWLOCATION, pliki cookie ustawione na stronie przekierowania zostaną utracone, a strona powitalna zakończy się niepowodzeniem z komunikatem "session expired". Jeśli wyłączę funkcję FOLLOWLOCATION, nie przekierowuję (oczywiście) i otrzymuję stronę HTML z "przeniesieniem strony do innej lokalizacji" z linkiem, który prowadzi mnie do strony powitalnej. Działa to tak, jak pliki cookie są ustawione, ale muszę postępować zgodnie z przekierowaniem i przejść bezpośrednio do strony powitalnej.Jak przekazywać pliki cookie w przekierowaniu CURL?

Więc jak mogę utrzymać ciasteczka tak, że są one prawidłowo ustawione?

To jest mój kod do tej pory:

$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) 

Dzięki za wszelką pomoc! ;

Odpowiedz

24

To stare pytanie, ale miałem ten sam problem, więc Google zabrał mnie tutaj. W końcu udało mi się go rozwiązać. Przekazując pusty string „”, aby ustawić CURLOPT_COOKIEFILE użyciu curl_setopt rozwiąże problem:

curl_setopt($ch, CURLOPT_COOKIEFILE, ""); 

widoczny punkt CURLOPT_COOKIEFILE z http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

3

Aby odpowiedzieć sobie, to jak to zrobiłem:

Pobierz kod header-http-status. Jeśli jest to przekierowanie, wyodrębnij nową lokalizację i przekierowuj ręcznie. Inaczej usunąć nagłówek i wyjście zawartość tematyczna:

$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

Więc po prostu być jasne, jesteś już ustawienie CURLOPT_FOLLOWLOCATION? – bhollis

+1

W prawo - ręcznie sprawdzam, czy jest to przekierowanie, czy nie. – acme

6

instruowania php na sesji curl używać ciasteczek należy ustawić dwie opcje:

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 

więc każdy plik cookie zostanie dołączony na CURLOPT_COOKIEJAR i te ciasteczko zostanie być przeprowadzane na każdym miejscu poprzez ustawienie CURLOPT_COOKIEFILE

+0

Nie działa, gdy następuje przekierowanie. –

Powiązane problemy