2010-10-08 19 views
10

Ich habe einen Fehlerphp curl mit CURLOPT_FOLLOWLOCATION Fehler

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

i viele Lösung google, aber mit dieser Seite sie nicht funktionieren. brauche nur CURLOPT_FOLLOWLOCATION. dummer Hoster möchte safe_mode oder open_basedir nicht aktivieren. Kann ich sie selbst aktivieren, kann ich htaccess mit einigen Parametern erstellen?

Antwort

13

Der Fehler bedeutet safe_mode oder open_basedir ARE aktiviert (wahrscheinlich open_basedir) Sie können wahrscheinlich auch nicht überschreiben, wenn Ihr Host über anständige Sicherheitseinstellungen verfügt.

So haben Sie die Wahl

1) Änderung Host (nicht wirklich wünschenswert Ich stelle mir vor)

2) fand eine ähnliche Funktion wie diejenigen verwenden, auf der PHP-curl_setopt Seite, dh http://www.php.net/manual/en/function.curl-setopt.php#95027

Die Nachfolgend finden Sie eine feste Version der Funktion in Nummer 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

lustig, aber Skript funktioniert gut auf meinem Host (billig und virtuell), aber Chef verwenden dumme Gastgeber und haben keine Lust zu ändern. über diese Funktion - ich weiß es, wenn ich anfange, Skript zu schreiben, ich manuell jede URL aufrufen, aber letzte URL nicht zu arbeiten, und nur mit CURLOPT_FOLLOWLOCATION hilft mir – kusanagi

+0

Eek tut mir leid, ich habe nicht wirklich die Funktion getestet, Sie ' Richtig, es funktioniert nicht (es geht davon aus, dass der Location-Header nicht der letzte ist). Ich habe meiner Antwort eine korrigierte Version hinzugefügt, die ich getestet habe. – Rwky

+1

Ihre Lösung hat ein paar Fehler. Die Regex sollte '[^ \ n]' sein. Wenn Sie 'curl_redirect_exec' rekursiv aufrufen, sollten Sie' $ curlopt_header' übergeben. –

0

Hallo ich diesen Zustand fix und fügte hinzu:

$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); 

und

in meiner .htaccess-Datei hinzufügen
php_flag safe_mode off 
php_flag open_basedir off 
+2

Woher kommen die Variablen $ curl und $ curl_handle? – Craig

1

Wenn Sie während der Umleitung nur Protokolle HTTP und HTTPS erlaubt verwenden CURLOPT_REDIR_PROTOCOLS, würden Sie in der Lage sein verwenden CURLOPT_FOLLOWLOCATION ohne safe_mode oder open_basedir angeben, dass.

+2

Einstellung 'CURLOPT_REDIR_PROTOCOLS' auf' CURLPROTO_HTTP | CURLPROTO_HTTPS' scheint leider nicht mit 'open_basedir' zu helfen. – Mahn

+0

Das gleiche für mich ... – zeflex