2013-03-26 20 views
5

Spróbuj, jak mogę, nie mogę uzyskać curl przekazać cookie PHPSESSID. Mam podobny układ do tego, co opisują inni, ale nie udało mi się uzyskać żadnego z proponowanych rozwiązań.curl nie przechodząc phpsessid

Mam stronę, która wysyła żądanie pobrania do pageA.php. pageA.php potrzebuje pewnych informacji z pageB.php, który znajduje się na innym serwerze, więc używam curl. pageB utrzymuje stan sesji, do której muszę dostać się i na mojej stronie.

Jestem w stanie przekazać inne pliki cookie z pageA do pageB, po prostu nie cookie PHPSESSID.

następujące prace (cookie przybywa na pageB):
$options[CURLOPT_COOKIE] = "myPHPSESSID=" . $sessionId;

Poniższa nie:

$options[CURLOPT_COOKIE] = "PHPSESSID=" . $sessionId; 

(I zbudować tablicę $ options, a następnie przekazać je do curl_set_opt_array)

W rzeczywistości ten ostatni powoduje błąd, którego nie potrafię rozpoznać, ponieważ moje połączenie z curl_exec nigdy nie wraca (i pageB nigdy nie został osiągnięty).

Próbowałem ustawienie nagłówka zamiast korzystania CURLOPT_COOKIE, ale również bez powodzenia:

$options[CURLOPT_HTTPHEADER][] = "Cookie: myPHPSESSID=" . $sessionId; 

powyższe działa dobrze ale

$options[CURLOPT_HTTPHEADER][] = "Cookie: PHPSESSID=" . $sessionId; 

nie.

PHP najwyraźniej nie chce, abym ręcznie ustawił PHPSESSID. Nie jestem pewien, czy jest to istotne, ale w żadnym momencie na stronie A nie nazywam się start_session() (chociaż próbowałem to zrobić i miałem takie same wyniki).

Zdaję sobie sprawę, że mogłem (prawdopodobnie) przekazać identyfikator sesji jako ciasteczko o innej nazwie i zadzwonić na stronę B pod numer set_session_id() lub coś podobnego. Ale naprawdę chcę wiedzieć, dlaczego to, co robię, nie działa, ponieważ wolałbym naprawić to, co robię źle, niż stworzyć obejście. Mogę dostarczyć kilka zrzutów różnych nagłówków, które są pingowane, jeśli to jest pomocne, ale sądzę, że to pytanie jest wystarczająco długie na teraz.

Dzięki ...

Odpowiedz

8

Mam do czynienia z tym samym problemem. Znaleziono rozwiązanie.

Zadzwoń pod session_write_close(); przed curl_exec.

To uratowało mi życie: http://kmak.1funkybit.com/?p=126 (przeczytaj wyjaśnienie).

Przykład:

<?php 
session_start(); 
var_dump($_SESSION); //See what's in session 
echo "<br>"; 



$c = curl_init('http://192.168.100.204/logintest/index.php?r=AccessTest/CheckAcess'); 
$parametros_post = 'action=verChau'; 
curl_setopt($c, CURLOPT_POST, true); 
curl_setopt($c, CURLOPT_POSTFIELDS, $parametros_post); 
curl_setopt($c, CURLOPT_VERBOSE, TRUE); 
curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=' . $_COOKIE['PHPSESSID']); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
session_write_close(); 
$page = curl_exec ($c); 
echo "<br>"; 
echo "<br>"; 
echo $page; 
curl_close ($c); 


?> 
+0

dzięki, chociaż widziałem tę radę i próbował go bezskutecznie. Moja strona nigdy nie wywołuje 'start_session();', więc 'session_write_close();' nie wydaje się mieć żadnego efektu. –

+0

Hmmmm, ale gdzie dostaniesz $ sessionID, jeśli nie rozpoczniesz żadnej sesji? Możesz przekazać PHPSESSID z curl, ponieważ robię to z Yii i zwykłym skryptem. Zaktualizowałem swój wpis skryptem. – JorgeeFG

+1

Oh - przepraszam za bycie niejasnym. '$ SessionId' pochodzi z przeglądarki klienta. Moja strona php, która używa curl jest tylko proxy, aby obejść problemy z wieloma domenami, więc nie utrzymuje żadnego stanu sesji. Czytałem '$ sessionId' z' $ _COOKIE', który towarzyszy każdemu żądaniu od klienta do strony proxy. –