Василий Г.
101 повідомлення
#15 років тому
Приветствую

Пытаюсь получить страницу через гет-запрос, использую CURL
Выдается ошибка
HTTP/1.1 302 Found

Прокси рабочий, прописываю в браузере - все работает

$user_agent = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14 WebMoney Advisor";
$proxy = "64.114.203.19:8080";
echo curl_string(';, '', $user_agent, $proxy );

function curl_string ($url, $urlstring, $user_agent, $proxy){
$ch = curl_init();
curl_setopt ($ch, CURLOPT_PROXY, $proxy);
curl_setopt ($ch, CURLOPT_HTTPPROXYTUNNEL, $proxy);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlstring);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt ($ch, CURLOPT_REFERER, $url);
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt ($ch, CURLOPT_TIMEOUT, 120); // таймаут соединения - 1 минуты
$result = curl_exec ($ch); // выполнить запрос
echo curl_error($ch);
return $result;
}


Спасибо
Вадим Т.
3240 повідомлень
#15 років тому
Куда катится мир...

1. HTTP/1.1 302 Found - это вовсе не ошибка
2. В вашем примере не GET запрос, а POST.
3. Значение таймаута 120 - это вовсе не 1 минута.
4. Почему CURLOPT_RETURNTRANSFER установлен в 0, если цель функции - вернуть результат запроса в виде строки?
5. Где curl_close?
6. Вообще более бессмысленного набора одновременно используемых опций найти, пожалуй, будет сложновато.

А для решения таких ситуаций с HTTP/1.1 302 Found пожалуйста используйте:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
Василий Г.
101 повідомлення
#15 років тому
tvv
Спасибо за ответ
Функция тестовая, поэтому и написана в таком виде
При добавлении опции curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
получаем
Warning: curl_setopt() : CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/.../public_html/script.php on line 56

Вот настройки сервера
safe_mode	Off	Off
open_basedir /home/mydomen/:/tmp:/usr/local/lib/php/ /usr/local/php5/lib/php:/usr/local/lib/php:/tmp:/var/www/htdocs:/var/www/html:/usr/local/directadmin/data/skins:./

Спасибо
Антончик О.
17 повідомлень
#15 років тому
DiamondPhoenix, как вариант решения данной проблемы. Вместо функции curl_exec можно использовать curl_redir_exec($ch)


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);
$header = $data;

$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)
$url = $last_url;
if (!$url)
$url = $last_url;
if (!$url)
$url = $last_url;
if (!isset($url))
$url = (isset($last_url)) ? $last_url : '';

$new_url = $url . '://' . $url . $url . ($url?'?'.$url:'');
curl_setopt($ch, CURLOPT_URL, $new_url);

return $this->curl_redir_exec($ch);
} else {
$curl_loops=0;
return $data;
// was: return $response;
}
}