Location в CURL
Добрый день. Очень часто при написании скриптов авторизации встает проблема с перенаправлением. Например вы отправляете POST запрос на авторизацию и в ответ ,при удачной автоизации, мы молучаем следующее:
HTTP/1.1 302 Found Date: Fri, 16 Jul 2010 10:43:07 GMT Server: Apache/2 Expires: Mon, 26 Jul 1997 05:00:00 GMT Last-Modified: Fri, 16 Jul 2010 10:43:07 GMT Cache-Control: post-check=0, pre-check=0 Pragma: no-cache Location: /rus++/options/ Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 20 Content-Type: text/html; charset=windows-1251
Итак при успешной автоизации скрипт нас должен отправить по адресу site.ru/rus++/options/ и такpих перенаправлений может быть целое множество. На помощь вам придет, функция на Php, которая парсит выдачу и перенаправляет нас куда нужно. Автор функции не Я, выдрал из одного забугорного даижка, но иногда очень выручает.
function curl_redir_exec($ch)
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops >= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
list($header, $data) = explode("nn", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302)
{
$matches = array();
preg_match('/Location:(.*?)n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!$url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!$url['scheme'])
$url['scheme'] = $last_url['scheme'];
if (!$url['host'])
$url['host'] = $last_url['host'];
if (!$url['path'])
$url['path'] = $last_url['path'];
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
//debug('Redirecting to', $new_url);
return curl_redir_exec($ch);
}
else
{
$curl_loops=0;
return $data;
}
}
Рекомендуем почитать