2010-10-08 8 views
10

mam błądphp curl z błędem CURLOPT_FOLLOWLOCATION

CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in

google wiele rozwiązań, ale z tej strony nie działają. potrzebujesz tylko CURLOPT_FOLLOWLOCATION. głupi gospodarz nie chce włączać safe_mode ani open_basedir. czy mogę je włączyć samodzielnie, czy można utworzyć htaccess z niektórymi parametrami?

Odpowiedz

13

Błąd oznacza safe_mode lub open_basedir ZAKOŃCZONE (prawdopodobnie open_basedir) prawdopodobnie nie można przesłonić, jeśli host ma przyzwoite ustawienia zabezpieczeń.

Więc masz wybór

1) szereg zmian (nie bardzo pożądane sobie wyobrazić)

2) wykorzystywać funkcję podobną do tych znalezionych na stronie curl_setopt php, tj http://www.php.net/manual/en/function.curl-setopt.php#95027

Poniżej znajduje się stałe wersja funkcji określonych w punkcie 2

function curl_redirect_exec($ch, &$redirects, $curlopt_header = false) { 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    $data = curl_exec($ch); 

    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    if ($http_code == 301 || $http_code == 302) { 
     list($header) = explode("\r\n\r\n", $data, 2); 

     $matches = array(); 
     preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches); 
     $url = trim(str_replace($matches[1], "", $matches[0])); 

     $url_parsed = parse_url($url); 
     if (isset($url_parsed)) { 
      curl_setopt($ch, CURLOPT_URL, $url); 
      $redirects++; 
      return curl_redirect_exec($ch, $redirects, $curlopt_header); 
     } 
    } 

    if ($curlopt_header) { 
     return $data; 
    } else { 
     list(, $body) = explode("\r\n\r\n", $data, 2); 
     return $body; 
    } 
} 
+0

Zabawne, ale skrypt działa dobrze na moim hoście (tanie i wirtualne), ale szef używa głupiego hosta i nie ma ochoty na zmianę. o tej funkcji - znam ją, kiedy zaczynam pisać skrypt i ręcznie wywołuję każdy adres URL, ale ostatni URL nie działa, i tylko przy pomocy CURLOPT_FOLLOWLOCATION pomaga mi – kusanagi

+0

Eee przepraszam, że tak naprawdę nie przetestowałem tej funkcji, ty ' re right to nie działa (zakłada, że ​​nagłówek Location nie jest ostatnim) Dodałem poprawioną wersję testowaną do mojej odpowiedzi. – Rwky

+1

Twoje rozwiązanie ma kilka błędów. Wyrażenie regularne powinno mieć postać '[^ \ n]'. Podczas rekursywnego wywoływania 'curl_redirect_exec' powinieneś przekazać' $ curlopt_header'. –

0

Hi naprawić dodając ten warunek:

$safeMode = @ini_get('safe_mode'); 
$openBasedir = @ini_get('open_basedir'); 
if (empty($safeMode) && empty($openBasedir)) { 
    curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true); 
}else 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

i dodanie w moim pliku .htaccess

php_flag safe_mode off 
php_flag open_basedir off 
+2

Skąd pochodzą zmienne $ curl i $ curl_handle? – Craig

1

Jeżeli określono, że tylko protokoły HTTP i HTTPS są dozwolone podczas przekierowania używając CURLOPT_REDIR_PROTOCOLS, byłbyś w stanie wykorzystać CURLOPT_FOLLOWLOCATION bez safe_mode lub open_basedir.

+2

Ustawienie 'CURLOPT_REDIR_PROTOCOLS' na' CURLPROTO_HTTP | CURLPROTO_HTTPS' niestety nie pomaga dla 'open_basedir'. – Mahn

+0

To samo dla mnie ... – zeflex