Проблема установки опции CURLOPT_FOLLOWLOCATION в СURL

Статус
В этой теме нельзя размещать новые ответы.

GrinVich

Новичок
Проблема установки опции CURLOPT_FOLLOWLOCATION в СURL

Прочитал много информации по этому поводу, но так и не нашел решения данному вопросу.

CURLOPT_FOLLOWLOCATION: При установке этого параметра в ненулевое значение, при получении HTTP заголовка "Location: " будет происходить перенаправление на указанный этим заголовком URL (это действие выполняется рекурсивно, для каждого полученного заголовка "Location:").

У меня на хостинге выдает вот такое сообщение об ошибке:
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/grinvich/domains/domain.ru/public_html/tools/curl/ebay_login.php on line 38
В чем может быть проблема и как ее исправить.
 

GrinVich

Новичок
Дело в том, что safe_mode отключен да и open_basedir установлен правильно.
 

hermit_refined

Отшельник
open_basedir установлен правильно
вполне достаточно того, что он вообще установлен (в ошибке, кстати, так и написано).
обрабатывайте редирект руками, если нет возможности отключить open_basedir.
 

GrinVich

Новичок
Автор оригинала: hermit_refined
вполне достаточно того, что он вообще установлен (в ошибке, кстати, так и написано).
обрабатывайте редирект руками, если нет возможности отключить open_basedir.
Т.е. проблема в том что этот open_basedir ?
Значит есть два варианта решения вопроса, попросить хостера сбросить значения open_basedir или обработать запрос руками.
Интересует второй вариант, каким образом это можно реализовать.
Можете предоставить кусок кода для визуальности.
 

hermit_refined

Отшельник
попросить хостера сбросить значения open_basedir
если есть хостер, которого надо об этом просить, то просить бесполезно.
Можете предоставить кусок кода для визуальности.
Вот оно - новое поколение. Curl'ом пользоваться умеют, а что такое редирект, и как его в цикле обработать - понятия не имеют.
см. хотя бы комментарии пользователей в мануале - вы же, наверное, не единственный с такой проблемой? ;-)
 

GrinVich

Новичок
Автор оригинала: StUV
правильно - это как?
т.е. что грит пхпинфо ?
Данные из phpinfo();

safe_mode Off
safe_mode_exec_dir no value
safe_mode_gid Off
safe_mode_include_dir no value

open_basedir /home/grinvich/domains/domain.ru/:/home/grinvich/domains/domain.ru/tmp/:/var/services/apache/www/:/var/services/apache/exec/:/var/services/php/lib/php/:/etc/virtual/

-~{}~ 16.02.07 17:45:

Автор оригинала: hermit_refined
если есть хостер, которого надо об этом просить, то просить бесполезно.

Вот оно - новое поколение. Curl'ом пользоваться умеют, а что такое редирект, и как его в цикле обработать - понятия не имеют.
см. хотя бы комментарии пользователей в мануале - вы же, наверное, не единственный с такой проблемой? ;-)
Да читал я коментарии в официальном мануале также, буржуины не умнее наших.
Покажи на примере как обойтись без этой функции чтобы все работало.

К примеру есть кусок кода:
PHP:
<?php
/*
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'   File:	                ebay_login.php
'
'   Description:            This script Login you on Ebay.com website using curl in php.
'
'   Written by:             Imran Khalid [email][email protected][/email]
'
'   Languages:              PHP + CURL
'
'   Date Written:           March 23, 2004
'
'   Version:            	V.1.0
'
'   Platform:               Windows 2000 / IIS / Netscape 7.1
'
'   Copyright:              Open Sorce Code (GPL)
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
*/	

// 1-Get First Login Page [url]http://signin.ebay.com/aw-cgi/eBayISAPI.dll?SignIn[/url]
// This page will set some cookies and we will use them for Posting in Form data.

	$ebay_user_id = "XXXX"; // Please set your Ebay ID
	$ebay_user_password = "YYYYY"; // Please set your Ebay Password
	$cookie_file_path = "crawler\ebay_login\cook"; // Please set your Cookie File path
	
	$LOGINURL = "http://signin.ebay.com/aw-cgi/eBayISAPI.dll?SignIn";
	$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)";
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$LOGINURL);
	curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
	curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
    $result = curl_exec ($ch);
    curl_close ($ch);

// 2- Post Login Data to Page [url]http://signin.ebay.com/aw-cgi/eBayISAPI.dll[/url]

	$LOGINURL = "http://signin.ebay.com/aw-cgi/eBayISAPI.dll";
	$POSTFIELDS = 'MfcISAPICommand=SignInWelcome&siteid=0&co_partnerId=2&UsingSSL=0&ru=&pp=&pa1=&pa2=&pa3=&i1=-1&pageType=-1&userid='. $ebay_user_id .'&pass='. $ebay_user_password;
    $reffer = "http://signin.ebay.com/aw-cgi/eBayISAPI.dll?SignIn";

	$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$LOGINURL);
	curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS,$POSTFIELDS); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_REFERER, $reffer);
	curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
	curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
    $result = curl_exec ($ch);
    curl_close ($ch); 
	print 	$result;	

?>
 

StUV

Rotaredom
GrinVich
Данные из phpinfo();
собсно, hermit_refined уже ответил
а я это к тому, что переводить сообщение об ошибке надо внимательно (если проблемы с английским) + выражение "установлен правильно" - на форуме некорректно - нужно указывать именно значение
ну это так, оффтоп... =)

-~{}~ 16.02.07 17:47:

Покажи на примере как обойтись без этой функции чтобы все работало.
опять же
что есть "все работало" в твоем понимании?
что у тебя не так без этого сетопта и как оно должно быть?
=)))
 

GrinVich

Новичок
Я привел пример кода в кодором обязательно должен работать редирект управляемый опцией CURLOPT_FOLLOWLOCATION.
А без редиректа выдает лишь заголовок.
Это можно проверить заменив строку
PHP:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
на
PHP:
curl_setopt($ch, CURLOPT_HEADER, 1);
 

hermit_refined

Отшельник
я несколько затрудняюсь оценить законность ваших действий, но в любом случае - простите - секретаршу, мыслящую исключительно в категориях "в чем проблема" и "чтобы все работало" я далее консультировать не буду :)
 

StUV

Rotaredom
Я привел пример кода
т.е. вместо того, чтобы потратить свое время и подробно описать что и как у тебя "не работает", ты хочешь чтобы я потратил свое время и потестил это у себя, а потом "клещами" вытягивал из тебя подробности требуемой тебе реализации ?!? =)))
 

GrinVich

Новичок
Ребят просто спросил ваше мнение, думал все таки возможно кто-то из вас сталкивался с данной проблемой.
 

Romula

Новичок
В документации в комментариях эта проблема обсуждается

If you are trying to use CURLOPT_FOLLOWLOCATION and you get this warning:
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set...

then you will want to read http://www.php.net/ChangeLog-4.php which says "Disabled CURLOPT_FOLLOWLOCATION in curl when open_basedir or safe_mode are enabled." as of PHP 4.4.4/5.1.5. This is due to the fact that curl is not part of PHP and doesn't know the values of open_basedir or safe_mode, so you could comprimise your webserver operating in safe_mode by redirecting (using header('Location: ...')) to "file://" urls, which curl would have gladly retrieved.

Until the curl extension is changed in PHP or curl (if it ever will) to deal with "Location:" headers, here is a far from perfect remake of the curl_exec function that I am using.

Since there's no curl_getopt function equivalent, you'll have to tweak the function to make it work for your specific use. As it is here, it returns the body of the response and not the header. It also doesn't deal with redirection urls with username and passwords in them.

<?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("\n\n", $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;
}
}
?>
 

Breeze

goshogun
Команда форума
Партнер клуба
Тема закрыта.
1. Правильный ответ был дан ранее.
2. Не надо некропостить.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху