Как передать файлы 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)
Спасибо за любую помощь!
;
Ответы
Ответ 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;
}
Ответ 4
Возможно, вы захотите также проверить эту библиотеку: http://github.com/shuber/curl