CURLOPT_FOLLOWLOCATION не активируется [дублировать]

17

Поэтому я продолжаю получать эту досадную ошибку на нескольких серверах (это предупреждение, поэтому я бы проигнорировал его, но мне нужна функция)

  

Предупреждение: curl_setopt () [function.curl-setopt]: CURLOPT_FOLLOWLOCATION не может быть активирована, если safe_mode включен или открыт open_basedir в /home/xxx/public_html/xxx.php в строке 56

Как я могу исправить это через SSH?     

задан Saulius Antanavicius 02.08.2011 в 23:06
источник
  • Какова ваша настройка (безопасный режим и / или открытый включен включен?) и чего вы пытаетесь достичь? –  aefxx 02.08.2011 в 23:10

5 ответов

13

Задайте safe_mode = Off в файле php.ini (обычно это / etc / на сервере). Если это уже отключено, просмотрите файл open_basedir в файле php.ini и измените его соответствующим образом.

В принципе, опция последующего местоположения была отключена как мера безопасности, но встроенные функции безопасности PHP, как правило, более раздражают, чем безопасны. Фактически, safe_mode устарел в PHP 5.3 .

    
ответ дан Flambino 02.08.2011 в 23:13
  • @Flambine: Освобожденный означает, что он все еще существует и работает так, как ожидалось, но он очень обескуражен. Он может и часто включается на старых платформах общего хостинга. Я согласен с тем, что safe_mode в лучшем случае раздражает. –  Wrikken 02.08.2011 в 23:30
  • @Wrikken: Вы правы, извините. Но я уверен, что safe_mode полностью исчезнет на PHP 6. Не то, чтобы теперь это какая-то помощь. Тем не менее, я перепутал их. –  Flambino 02.08.2011 в 23:45
  • btw: согласно php.net/releases/NEWS_5_4_0_alpha1.txt safe_mode удаляется в PHP 5.4 –  Floern 02.08.2011 в 23:59
  • Если вы находитесь на общем сервере, это не опция для изменения php.ini, есть ли другие решения? –  Joseph Astrahan 27.03.2014 в 06:02
  • @JosephAstrahan Во-первых, я бы сказал, получить лучшего хостинг-провайдера. Но другой ответ на этот вопрос имеет возможное обходное решение. Не знаю, будет ли это работать, хотя –  Flambino 27.03.2014 в 21:48
11

Попробуйте это. Если требуется перенаправление и включен режим safemode, он будет следовать по ссылке на основе заголовка (если ваши захватывающие изображения, хотя это не будет работать, поскольку он добавляет заголовок к возврату), это обходное решение для вашего специфическая проблема, у меня была такая же проблема, когда клиент установил один из моих сценариев, поэтому пришлось придумать это. Он также регистрирует ошибки: curl.error.log .. полезный eh

<?php 
function geturl($url) {
    (function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini');

    $curl = curl_init();
    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
    $header[] = "Pragma: ";

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0');
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_REFERER, $url);
    curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    //curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //CURLOPT_FOLLOWLOCATION Disabled...
    curl_setopt($curl, CURLOPT_TIMEOUT, 60);

    $html = curl_exec($curl);

    $status = curl_getinfo($curl);
    curl_close($curl);

    if ($status['http_code'] != 200) {
        if ($status['http_code'] == 301 || $status['http_code'] == 302) {
            list($header) = explode("\r\n\r\n", $html, 2);
            $matches = array();
            preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches);
            $url = trim(str_replace($matches[1],"",$matches[0]));
            $url_parsed = parse_url($url);
            return isset($url_parsed) ? geturl($url) : '';
        }

        $oline='';
        foreach ($status as $key => $eline) {
            $oline .= '['.$key.']'.$eline.' ';
        }
        $line = $oline." \r\n ".$url."\r\n-----------------\r\n";

        $handle = @fopen('./curl.error.log', 'a');
        fwrite($handle, $line);
        return false;
    }
    return $html;
}
    
ответ дан Lawrence Cherone 02.08.2011 в 23:18
  • Вы можете «добавить», чтобы новый URL-адрес не был файлом: // url. Который может отображать содержимое «file: ///myproject/database.php» и т. Д. Который запрещен cURL по умолчанию с 7.19.4 (см. CURLOPT_REDIR_PROTOCOLS). У нижней версии curl не было такого ограничения, поэтому CURLOPT_FOLLOWLOCATION не разрешено в безопасном режиме. –  Bob Fanger 16.10.2012 в 00:22
  • Неопределенная переменная: referer –  Nov 12 '13 at 11:05 12.11.2013 в 12:05
  • @ 2astalavista благодаря исправлению –  Lawrence Cherone 12.11.2013 в 12:15
  • Ницца, я искал точно для такого обходного пути! –  Antony Harder 12.01.2014 в 04:30
  • Большое вам спасибо за это. Я пытался использовать benalman.com/projects/php-simple-proxy и // curl_setopt ($ curl, CURLOPT_FOLLOWLOCATION, true); // CURLOPT_FOLLOWLOCATION Отключено ... был способ выйти на сервер. –  beam022 04.10.2014 в 05:36
2

О безопасном режиме и опции open_basedir:

Ссылка

Ссылка

    
ответ дан Timur 02.08.2011 в 23:17
2

Чтобы решить эту проблему, просто поставьте safe_mode = Off и очистите open_base_dir в файле php.ini.

    
ответ дан Marcos Rezende 07.03.2012 в 14:11
  • Это не вариант, если вы находитесь на общем сервере, где у вас нет доступа к php.ini. –  Paul 27.01.2015 в 20:06
1

Просто до тех пор, пока open_basedir или safe_mode включен в файле php.ini, конфигурации CURLOPT_FOLLOWLOCATION не может использоваться. Чтобы изменить эти настройки, я могу дать только общие замечания:

  1. SSH на сервер
  2. cd в каталог (обычно / etc / php5 на linux, зависит от вашего дистрибутива или ОС), который содержит php.ini
  3. sudo для редактирования (например, sudo nano php.ini ).
  4. отредактируйте строки, которые указывают open_basedir или safe_mode, и либо отключите их.

Не забудьте перезапустить свой httpd после этого!

    
ответ дан Sajid 02.08.2011 в 23:14