Подтвердить что ты не робот

Как передать файлы cookie в CURL-перенаправление?

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

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

Это мой код:

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

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

4b9b3361

Ответ 1

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

curl_setopt($ch, CURLOPT_COOKIEFILE, "");

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

Ответ 2

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

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

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

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

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

}