Помогите отключить директиву Open_basedir
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/username/public_html/sts/index.php on line 170
Хотя на оф.сайте этого хостинга пишется, что Safe mode отключен o_0
На самом хостинге присутствует Panel C и Веб-консоль SSH. Пытаюсь действовать по этой инструкции: http://www.lsdeex.ru/archives/18
При наборе команды chmod 774 /usr/local/etc/php.ini получаю ошибку: -bash: chmod 774 /usr/local/etc/php.ini: command not found. Хотя сама команда chmod рабочая! я проверял на других файлах.
Далее по инструкции требуется открыть в редакторе php.ini, используя vim, но эта команда недоступна. Доступны лишь следующие команды:
Помогите пожалуйста новичку(((
[QUOTE=Tolias28]
на оф.сайте этого хостинга пишется, что Safe mode отключен
[/QUOTE]
Вы всегда можете это проверить с помощью phpinfo().
Цитата: Alexander92
Вы всегда можете это проверить с помощью phpinfo().
Хм, проверил, оказывается, что safe-mode все таки отключен :confused:
Или как понимать в разделе Configuration PHP Core следующие строчки...
Цитата:
safe_mode Off
safe_mode_exec_dir /usr/local/php/bin
safe_mode_gid Off
safe_mode_include_dir no value
safe_mode_exec_dir /usr/local/php/bin
safe_mode_gid Off
safe_mode_include_dir no value
Почему же тогда CURLOPT_FOLLOWLOCATION не работает :(
Кстати, там же пишется, что open_basedir = /home/:/usr/lib/php:/tmp
Цитата: Tolias28
Почему же тогда CURLOPT_FOLLOWLOCATION не работает :(
Потому что open_basedir включен. Повторюсь, обращайтесь в техподдержку. В крайнем случае, можете подробно почитать описание curl_setopt, там в пользовательских комментариях есть несколько вариантов решения этой проблемы "в обход" официального способа.
Цитата: Alexander92
Повторюсь, обращайтесь в техподдержку.
Я обратился туда еще до того, как здесь сию тему создал:) Просто пока жду реакции техподдержки, ищу решение в гуглях, форумах и т.д...
P.S. По прежнему буду благодарен за любые идеи.
CURLOPT_FOLLOWLOCATION означает, что если получен 301 или 302 ответ от сервера, то это не пойдёт в результат курла, а перейдёт автоматом дальше... таким образом эмуляция followlocation означает обработку в цикле 301 и 302 ответов))) и особых функций-то не надо, достаточно
Я попробовал несколько альтернативных функций, но ни одна в моем скрипте не отдает нужную страницу, а вместо этого $content вообще ничего не принимает и полностью пустой:(
Вот мой старый кусок кода с включенным FOLLOWLOCATION, где происходит авторизация в Вконтакте и получение страницы с закладками, и все отлично работало на пржнем хостинге:
Код:
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');
$post = array(
'act' => 'login',
'q' => '',
'al_frame' => '1',
'expire' => '',
'captcha_sid' => '',
'captcha_key' => '',
'from_host' => 'vkontakte.ru',
'email' => $login,
'pass' => $password
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$content = curl_exec($ch);
$sid = substr($content, strpos($content, "setCookieEx('sid', '") + 20, 60);
$cookie = 'remixsid=' . $sid;
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/fave');
$content = curl_exec($ch);
curl_close($ch);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');
$post = array(
'act' => 'login',
'q' => '',
'al_frame' => '1',
'expire' => '',
'captcha_sid' => '',
'captcha_key' => '',
'from_host' => 'vkontakte.ru',
'email' => $login,
'pass' => $password
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$content = curl_exec($ch);
$sid = substr($content, strpos($content, "setCookieEx('sid', '") + 20, 60);
$cookie = 'remixsid=' . $sid;
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/fave');
$content = curl_exec($ch);
curl_close($ch);
А вот мое сегодняшнее произведение... где я пытался обойти FOLLOWLOCATION с помощью функции, на которую вы дали ссылку выше:
Код:
function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
$mr = $maxredirect === null ? 5 : intval($maxredirect);
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
} else {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
if ($mr > 0) {
$newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$rch = curl_copy_handle($ch);
curl_setopt($rch, CURLOPT_HEADER, true);
curl_setopt($rch, CURLOPT_NOBODY, true);
curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
do {
curl_setopt($rch, CURLOPT_URL, $newurl);
$header = curl_exec($rch);
if (curl_errno($rch)) {
$code = 0;
} else {
$code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newurl = trim(array_pop($matches));
} else {
$code = 0;
}
}
} while ($code && --$mr);
curl_close($rch);
if (!$mr) {
if ($maxredirect === null) {
trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
} else {
$maxredirect = 0;
}
return false;
}
curl_setopt($ch, CURLOPT_URL, $newurl);
}
}
return curl_exec($ch);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');
$post = array(
'act' => 'login',
'q' => '',
'al_frame' => '1',
'expire' => '',
'captcha_sid' => '',
'captcha_key' => '',
'from_host' => 'vkontakte.ru',
'email' => $login,
'pass' => $password
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$content = curl_exec_follow($ch);
$sid = substr($content, strpos($content, "setCookieEx('sid', '") + 20, 60);
$cookie = 'remixsid=' . $sid;
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/fave');
$content = curl_exec_follow($ch);
curl_close($ch);
$mr = $maxredirect === null ? 5 : intval($maxredirect);
if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
} else {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
if ($mr > 0) {
$newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$rch = curl_copy_handle($ch);
curl_setopt($rch, CURLOPT_HEADER, true);
curl_setopt($rch, CURLOPT_NOBODY, true);
curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
do {
curl_setopt($rch, CURLOPT_URL, $newurl);
$header = curl_exec($rch);
if (curl_errno($rch)) {
$code = 0;
} else {
$code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
if ($code == 301 || $code == 302) {
preg_match('/Location:(.*?)\n/', $header, $matches);
$newurl = trim(array_pop($matches));
} else {
$code = 0;
}
}
} while ($code && --$mr);
curl_close($rch);
if (!$mr) {
if ($maxredirect === null) {
trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
} else {
$maxredirect = 0;
}
return false;
}
curl_setopt($ch, CURLOPT_URL, $newurl);
}
}
return curl_exec($ch);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');
$post = array(
'act' => 'login',
'q' => '',
'al_frame' => '1',
'expire' => '',
'captcha_sid' => '',
'captcha_key' => '',
'from_host' => 'vkontakte.ru',
'email' => $login,
'pass' => $password
);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$content = curl_exec_follow($ch);
$sid = substr($content, strpos($content, "setCookieEx('sid', '") + 20, 60);
$cookie = 'remixsid=' . $sid;
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/fave');
$content = curl_exec_follow($ch);
curl_close($ch);
Не работает оно и усе... и ты хоть тресни:(
блин, этой ночью они в контакте еще и авторизацию поменяли... Сейчас она не пашет даже на старом платном сервере. Придется снова мудрить...
Вот есть старый PHP-файл с включенным FOLLOWLOCATION, который на платном хостинге отлично работает. Беру я второй PHP-файл, в котором отключаю FOLLOWLOCATION и включаю пользовательскую функцию curl_exec_follow в код. Пробую запускать этот файл - авторизация не происходит. Удаляю этот новый файл, запускаю старый файл с включенным FOLLOWLOCATION, но и он уже теперь не работает!!! И лишь по просшествии нескольких дней он каким-то чудом стает работоспособным. И это при том, что я его от самого начала до конца не менял абсолютно! Вот как такую мистику объяснить? В чем собака зарыта?
Вопрос можно считать исчерпаным.