2010-10-08 12 views
10

i obtenido un errorphp rizo con el error CURLOPT_FOLLOWLOCATION

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

I Google muchas solución, pero con este sitio que no funcionan. solo necesita CURLOPT_FOLLOWLOCATION. El hoster estúpido no quiere habilitar safe_mode o open_basedir. ¿Puedo habilitarlos por mí mismo, puede crear htaccess con algunos parámetros?

Respuesta

13

El error significa safe_mode o open_basedir están habilitadas (probablemente open_basedir) es probable que no puede anular o bien si su anfitrión tiene ninguna configuración de seguridad decente.

Así que usted tiene una opción

1) cambio de acogida (no es realmente deseable que imaginar)

2) utilizar una función similar a los encontrados en la página curl_setopt php, es decir http://www.php.net/manual/en/function.curl-setopt.php#95027

El siguiente es una versión fija de la función especificada en el punto 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

divertido, pero la escritura funciona bien en mi host (barato y virtual), pero el jefe de acogida utilizar estúpida y no tienen deseo de cambiar. sobre esta función -i lo saben, cuando comienzo a escribir la escritura i llamada manualmente cada URL, pero la última URL no acostumbra a trabajar, y sólo utilizando CURLOPT_FOLLOWLOCATION me ayuda – kusanagi

+0

EEK siento que en realidad no probar la función, que' tienes razón no funciona (que asume la cabecera de ubicación no es la última) he añadido una versión corregida probé a mi respuesta. – Rwky

+1

Su solución tiene algunos errores. La expresión regular debería ser '[^ \ n]'. Cuando llames recursivamente a 'curl_redirect_exec' debes pasar' $ curlopt_header'. –

0

Hola fijo la adición de esta condición:

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

y añadiendo en mi archivo .htaccess

php_flag safe_mode off 
php_flag open_basedir off 
+2

¿Dónde su rizo $ y $ curl_handle las variables vienen? – Craig

1

Si especifica que sólo los protocolos HTTP y HTTPS son permitidos durante redirección utilizando CURLOPT_REDIR_PROTOCOLS, que sería capaz de usar CURLOPT_FOLLOWLOCATION sin safe_mode o open_basedir.

+2

Configuración '' CURLOPT_REDIR_PROTOCOLS' a CURLPROTO_HTTP | CURLPROTO_HTTPS' no parece ayudar con 'open_basedir' tristemente. – Mahn

+0

Lo mismo para mí ... – zeflex

Cuestiones relacionadas