Как мне передать куки при перенаправлении CURL? - PullRequest
22 голосов
/ 22 сентября 2009

представьте следующий сценарий: я открываю соединение CURL и передаю некоторые XML-Logindata через POST. Сервер отвечает перенаправлением 302, где устанавливаются куки-файлы сеанса, и перенаправляет меня на следующую страницу приветствия. Если я включаю FOLLOWLOCATION, файлы cookie, установленные на странице перенаправления, теряются, и страница приветствия завершается с ошибкой «сеанс истек». Если я отключу FOLLOWLOCATION, я не буду перенаправлен (очевидно) и получу HTML-страницу с «страницей, перемещенной в другое место» со ссылкой, которая ведет меня на страницу приветствия. Это работает, когда куки установлены, но мне нужно следовать перенаправлению и сразу перейти на страницу приветствия.

Итак, как мне сохранить куки, чтобы они были установлены правильно?

Это мой код:

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

Спасибо за любую помощь! ;

Ответы [ 4 ]

28 голосов
/ 09 сентября 2012

Это старый вопрос, но у меня была такая же проблема, поэтому Google взял меня сюда. Наконец мне удалось это решить. Передав пустую строку "" для установки CURLOPT_COOKIEFILE с помощью curl_setopt, вы решите проблему:

curl_setopt($ch, CURLOPT_COOKIEFILE, "");

См. Раздел CURLOPT_COOKIEFILE из http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

6 голосов
/ 26 августа 2010

, чтобы настроить php в сеансе curl на использование куки, вы должны установить два параметра:

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

, поэтому каждый файл cookie будет добавлен в CURLOPT_COOKIEJAR, и эти файлы cookie будут перенесены в любое место с настройкой CURLOPT_COOKIEFILE

3 голосов
/ 22 сентября 2009

Чтобы ответить себе, вот как я это сделал:

Получите код заголовка-http-статуса. Если это перенаправление, извлеките новое местоположение и перенаправьте вручную. В противном случае удалите заголовок и выведите содержимое:

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

}
2 голосов
/ 26 августа 2010

Вы также можете проверить эту библиотеку: http://github.com/shuber/curl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...