2011-08-02 26 views
17

Więc trzymam się ten przykry błąd na wielu serwerach (jest to ostrzeżenie, tak bym go ignorować, ale muszę funkcję)CURLOPT_FOLLOWLOCATION nie może być aktywowany

Warning: curl_setopt() [function.curl -setopt]: CURLOPT_FOLLOWLOCATION nie może być aktywowany, gdy safe_mode jest włączona lub open_basedir jest ustawiony w /home/xxx/public_html/xxx.php na linii 56

jak pójdę o ustalenie tego poprzez SSH?

+0

Jaka jest twoja konfiguracja (tryb awaryjny i/lub tryb openir jest włączony?) I co próbujesz osiągnąć? – aefxx

Odpowiedz

13

Ustaw safe_mode = Off w pliku php.ini (zwykle znajduje się w/etc/na serwerze). Jeśli to już jest wyłączone, poszukaj rzeczy w pliku php.ini i zmień je odpowiednio.

Zasadniczo opcja śledzenia lokalizacji została wyłączona jako zabezpieczenie, ale wbudowane funkcje zabezpieczeń PHP są zwykle bardziej irytujące niż bezpieczne. W rzeczywistości, safe_modeis deprecated in PHP 5.3.

+2

@Flambine: Deparyated oznacza, że ​​nadal istnieje i działa zgodnie z oczekiwaniami, ale jest wysoce odradzany. Może i często jest włączony na starszych współdzielonych platformach hostingowych. Zgadzam się, że safe_mode jest w najlepszym razie uciążliwe. – Wrikken

+0

@Wrikken: Masz rację, przepraszam. Jednak, jak sądzę, safe_mode całkowicie zniknie w PHP 6. Nie, to teraz jest jakaś pomoc. Mimo to, obu pomieszałem. – Flambino

+2

btw: zgodnie z http://www.php.net/releases/NEWS_5_4_0_alpha1.txt safe_mode jest usuwany w PHP 5.4 – Floern

1

Po prostu, jeśli w pliku php.ini włączone jest open_basedir lub safe_mode, nie można użyć konfiguracji CURLOPT_FOLLOWLOCATION. Aby zmienić te ustawienia, mogę dać tylko ogólne Uwagi:

  1. SSH do serwera
  2. cd do katalogu (zwykle/etc/php5 na linux, zależy od dystrybucji lub systemu operacyjnego), który zawiera php.ini
  3. sudo do edycji (np. sudo nano php.ini).
  4. edytuj linie, które określają open_basedir lub safe_mode i albo je wyłącz.

Pamiętaj o ponownym uruchomieniu serwera httpd później!

11

spróbować tego, jeżeli wymagane jest przekierowanie i safemode jest włączona będzie w link na podstawie nagłówka (jeśli chwytając obrazy jednak nie będą działały, ponieważ dodają nagłówek do zwrotu), jest to obejście twojego konkretnego problemu, miałem ten sam problem, gdy klient zainstalował jeden z moich skryptów, więc musiał wymyślić to. Będzie również zaloguj błędy do: curl.error.log .. użyteczne 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; 
} 
+0

"nie" możesz dodać, że nowy adres URL nie jest adresem URL pliku: //. Które mogłyby narazić zawartość "file: ///myproject/database.php" itp. Które jest domyślnie zabronione przez cURL od wersji 7.19.4 (zobacz CURLOPT_REDIR_PROTOCOLS). Niższa wersja zawijania nie ma tego ograniczenia, dlatego funkcja CURLOPT_FOLLOWLOCATION nie jest dozwolona w trybie awaryjnym. –

+0

Niezdefiniowana zmienna: referer –

+0

@ 2astalavista thanks fixed –

2

Aby rozwiązać ten problem, wystarczy umieścić safe_mode = Off i jasne open_base_dir w pliku php.ini.

+2

Nie jest to opcja, jeśli jesteś na wspólnym serwerze, na którym nie masz dostępu do pliku php.ini. – Paul

Powiązane problemy