Aprende a lidiar con el tedioso problema de CURLOPT_FOLLOWLOCATION usando cURL en PHP

cURL es una biblioteca que le permite realizar solicitudes HTTP en PHP. El comando curl_exec en PHP es un puente para usar curl desde la consola. curl_exec facilita la realización rápida y sencilla de solicitudes GET / POST, recibe respuestas de otros servidores como JSON y descarga archivos.

En algunos entornos de desarrollo, la ejecución del siguiente código arrojará lo mencionado debido al uso de CURLOPT_FOLLOWLOCATION:

<?php 

$ch = curl_init(); 
curl_setopt( $ch, CURLOPT_URL, "http://someweb.com/some-api.json"); // URL to post 
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, "username=Batman&password=DoYouWantToKnowMySecretIdentity");
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);// 1 or TRUE
// Ejecutar
$result = curl_exec( $ch ); 
curl_close($ch);
// mostrar "response"
echo "Reply Response: " . $result; 

En este artículo aprenderá por qué sucede esto y cómo solucionarlo.

Por que sucede esto

Este error ocurre cuando su configuración de PHP no le permite seguir una ubicación.

Gracias capitán obvio

Soluciones posibles

Como en todos los entornos y casos, no todas las opciones enumeradas funcionarán para usted:

1. Establezca CURLOPT_FOLLOWLOCATION en falso

La opción CURLOPT_FOLLOWLOCATION indica si cURL debe seguir las redirecciones 3xx HTTP o no. Cuando solicitas una URL, a veces puede ser redirigido a otra URL, por ejemplo en PHP puede redirigir usando:

header('Location: http://example.com/');

De forma predeterminada, esta opción está deshabilitada y, normalmente, no hay una buena razón para deshabilitarla, sin embargo, si sabe lo que está haciendo y está bastante seguro de que su solicitud nunca será redirigida, simplemente puede deshabilitar la opción:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);

2. Deshabilite el modo seguro de PHP

El modo seguro es un intento de resolver algunos de los problemas que se presentan cuando se ejecuta un servidor web habilitado para PHP en un entorno de alojamiento compartido. Sin embargo, las comprobaciones de seguridad adicionales impuestas por el Modo seguro se realizan a nivel de PHP, ya que la arquitectura de seguridad del sistema operativo y el servidor web subyacente no suele ser suficiente para imponer las restricciones de seguridad necesarias para un entorno multiusuario, en el que muchos usuarios pueden poder cargar y ejecutar código PHP.

Habilitar el modo seguro impone varias restricciones a los scripts PHP, estas restricciones se refieren principalmente al acceso a archivos, acceso a variables de entorno y control de la ejecución de procesos externos. Estas restricciones afectan a cURL cuando las opciones de FOLLOWLOCATION están habilitadas, por lo tanto, en caso de que no pueda deshabilitar esa opción en cURL, para que su script funcione, deberá deshabilitar el modo seguro modificando su archivo php.ini.

Use cualquier código o editor de texto y edite su archivo php.ini y busca la opción safe_mode y establece Off como valor, como probablemente ya lo haya hecho On.

Disable safe mode PHP

Reinicie Apache y vuelva a intentar ejecutar su script. Alternativamente, si no puede modificar el archivo php.ini en su entorno, puede intentar establecer esta propiedad dinámicamente con PHP en su script usando:

ini_set('safe_mode', false);

Aunque la segunda forma es poco probable que funcione para la mayoría de los desarrolladores, vale la pena intentarlo.

3. Establezca open_basedir en none

La función open_basedir define las ubicaciones o rutas desde las que PHP puede acceder a los archivos utilizando funciones como fopen()gzopen(). Si un archivo está fuera de las rutas definidas por open_basedir, PHP se negará a abrirlo. No puede utilizar un enlace simbólico como solución temporal, porque la ruta a la que se resuelve el enlace simbólico cae dentro de las restricciones de la open_basedirfunción.

Para deshabilitar la opción open_basedir solo necesitamos comentarla en el archivo php.ini. Abra un editor de código o texto y edite el archivo php.ini, busque la opción open_basedir y comente con el prefijo ;:

; open_basedir, if set, limits all file operations to the defined directory
; and below.  This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; http://php.net/open-basedir
;open_basedir =

Guarde los cambios, reinicie Apache e intente ejecutar su script nuevamente.

Puede hacerlo en su servidor si usa Plesk para modificar el open_basedir desde una GUI. Abra plesk, navegue hasta su dominio y abra Configuración de PHP.

PHP Settings Plesk

Ahora proceda de la lista, para buscar open_basedir y seleccionar ninguno de la lista:

open_basedir Plesk

Guarde los cambios e intente ejecutar su script nuevamente.

Menciones honoríficas

Si usa una biblioteca como Unirest y obtiene tal error, puede probar la primera opción configurando la opción CURLOPT_FOLLOWLOCATION en falso sin modificar el código fuente de la biblioteca usando:

Unirest\Request::curlOpts(array(
    CURLOPT_FOLLOWLOCATION => false
));

No olvide compartir con la comunidad qué opción funcionó para ti.

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores