Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите отключить директиву Open_basedir

37K
24 августа 2011 года
Tolias28
48 / / 20.09.2010
Зарегистрировал себе домен с хостингом на hostinger.com.ua. Выложил PHP-скрипты на сервер и обнаружил, что они не работают и в браузер отдается ошибка:
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, но эта команда недоступна. Доступны лишь следующие команды:


Помогите пожалуйста новичку(((
278
24 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Прав у вас просто не хватает для таких операций. На уровне php.ini вам никто не даст не хостинге менять директивы. =) Насколько мне память не изменяет, open_basedir не меняется даже на уровне .htaccess. Обращайтесь в техподдержку хостинга, другого решения нет.

[QUOTE=Tolias28]
на оф.сайте этого хостинга пишется, что Safe mode отключен
[/QUOTE]
Вы всегда можете это проверить с помощью phpinfo().
37K
24 августа 2011 года
Tolias28
48 / / 20.09.2010
Цитата: 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



Почему же тогда CURLOPT_FOLLOWLOCATION не работает :(

Кстати, там же пишется, что open_basedir = /home/:/usr/lib/php:/tmp

278
24 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: Tolias28

Почему же тогда CURLOPT_FOLLOWLOCATION не работает :(


Потому что open_basedir включен. Повторюсь, обращайтесь в техподдержку. В крайнем случае, можете подробно почитать описание curl_setopt, там в пользовательских комментариях есть несколько вариантов решения этой проблемы "в обход" официального способа.

37K
24 августа 2011 года
Tolias28
48 / / 20.09.2010
Цитата: Alexander92
Повторюсь, обращайтесь в техподдержку.


Я обратился туда еще до того, как здесь сию тему создал:) Просто пока жду реакции техподдержки, ищу решение в гуглях, форумах и т.д...

37K
24 августа 2011 года
Tolias28
48 / / 20.09.2010
эх "обрадовала" меня служба поддержки... Сказали, что отключение safe mode и изменение директивы open_basedir невозможно на их серверах. Придется искать обходной путь. В инете раньше видел функции, эмулирующие работу CURLOPT_FOLLOWLOCATION. Попробую этим путем пойти.

P.S. По прежнему буду благодарен за любые идеи.
271
25 августа 2011 года
MrXaK
721 / / 31.12.2002
CURLOPT_FOLLOWLOCATION означает, что если получен 301 или 302 ответ от сервера, то это не пойдёт в результат курла, а перейдёт автоматом дальше... таким образом эмуляция followlocation означает обработку в цикле 301 и 302 ответов))) и особых функций-то не надо, достаточно почитать ман
37K
25 августа 2011 года
Tolias28
48 / / 20.09.2010
Спасибо! Но для меня не так все просто, как может сперва показаться...
Я попробовал несколько альтернативных функций, но ни одна в моем скрипте не отдает нужную страницу, а вместо этого $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);


А вот мое сегодняшнее произведение... где я пытался обойти 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);


Не работает оно и усе... и ты хоть тресни:(
37K
25 августа 2011 года
Tolias28
48 / / 20.09.2010
блин, этой ночью они в контакте еще и авторизацию поменяли... Сейчас она не пашет даже на старом платном сервере. Придется снова мудрить...
37K
28 августа 2011 года
Tolias28
48 / / 20.09.2010
Как оказалось, никто никакую авторизацию не менял. Просто после этого кода прежний скрипт себя как-то странно ведет, чему я не могу найти объяснения.
Вот есть старый PHP-файл с включенным FOLLOWLOCATION, который на платном хостинге отлично работает. Беру я второй PHP-файл, в котором отключаю FOLLOWLOCATION и включаю пользовательскую функцию curl_exec_follow в код. Пробую запускать этот файл - авторизация не происходит. Удаляю этот новый файл, запускаю старый файл с включенным FOLLOWLOCATION, но и он уже теперь не работает!!! И лишь по просшествии нескольких дней он каким-то чудом стает работоспособным. И это при том, что я его от самого начала до конца не менял абсолютно! Вот как такую мистику объяснить? В чем собака зарыта?
37K
01 сентября 2011 года
Tolias28
48 / / 20.09.2010
Все! Уже разобрался! Правда пришлось перечитать немало информации о протоколе HTTP, но зато вот написал сам свою функцию с редиректами и теперь все прекрасно работает без всяких FOLLOWLOCATION.
Вопрос можно считать исчерпаным.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог