txt file_get_contents ejemplos php url external file-get-contents ini

ejemplos - PHP ini file_get_contents url externa



file_get_contents(''php//input'') (7)

Yo uso la siguiente función de PHP:

file_get_contents(''http://example.com'');

Cada vez que hago esto en un servidor determinado, el resultado está vacío. Cuando lo hago en cualquier otro lugar, el resultado es el contenido de la página. Sin embargo, cuando, en el servidor donde el resultado está vacío, uso la función localmente - sin acceder a una URL externa ( file_get_contents(''../simple/internal/path.html''); ), funciona.

Ahora, estoy bastante seguro de que tiene algo que ver con cierta configuración de php.ini. Sin embargo, de lo que no estoy seguro es de cuál . Por favor ayuda.


Añadir:

allow_url_fopen=1

en tu archivo php.ini Si está utilizando alojamiento compartido, cree uno primero.


Complementando la respuesta de Aillyn, podría usar una función como la siguiente para imitar el comportamiento de file_get_contents:

function get_content($URL){ $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $URL); $data = curl_exec($ch); curl_close($ch); return $data; } echo get_content(''http://example.com'');


Está relacionado con la configuración de configuración ini allow_url_fopen .

Debe tener en cuenta que habilitar esa opción puede hacer que algunos errores en su código sean explotables.

Por ejemplo, esta falla al validar la entrada puede convertirse en una vulnerabilidad de ejecución remota de código completamente desarrollada:

copy($_GET["file"], ".");


Esto también dará a los enlaces externos una ruta absoluta sin tener que usar php.ini

<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($ch); curl_close($ch); $result = preg_replace("#(</s*a/s+[^>]*href/s*=/s*[/"''])(?!http)([^/"''>]+)([/"''>]+)#",''$1http://www.your_external_website.com/$2$3'', $result); echo $result ?>


La configuración que está buscando es allow_url_fopen .

Tienes dos formas de fsockopen() sin cambiar php.ini, uno de ellos es usar fsockopen() , y el otro es usar cURL .

Recomiendo usar cURL sobre file_get_contents() todos modos, ya que fue creado para esto.


Las respuestas proporcionadas arriba resuelven el problema, pero no explican el comportamiento extraño que describe el OP. Esta explicación debería ayudar a cualquiera a probar la comunicación entre sitios en un entorno de desarrollo donde todos estos sitios residen en el mismo host (y el mismo virtualhost, estoy trabajando con apache 2.4 y php7.0).

Hay una sutileza con file_get_contents() que encontré que es absolutamente relevante aquí pero sin abordar (probablemente porque está apenas documentado o no está documentado por lo que puedo decir o está documentado en un oscuro documento de modelo de seguridad php que no puedo encontrar).

Con allow_url_fopen establecido en Off en todos los contextos relevantes (ej. /etc/php/7.0/apache2/php.ini , /etc/php/7.0/fpm/php.ini , etc ...) y allow_url_fopen establecido en On en el comando contexto de línea (es decir, /etc/php/7.0/cli/php.ini ), se permitirán las llamadas a file_get_contents() para un recurso local y no se registrará ninguna advertencia, como por ejemplo:

file_get_contents(''php://input'');

o

// Path outside document root that webserver user agent has permission to read. e.g. for an apache2 webserver this user agent might be www-data so a file at /etc/php/7.0/filetoaccess would be successfully read if www-data had permission to read this file file_get_contents(''<file path to file on local machine user agent can access>'');

o

// Relative path in same document root file_get_contents(''data/filename.dat'')

Para concluir, la restricción allow_url_fopen = Off es análoga a una regla de iptables en la cadena OUTPUT , donde la restricción solo se aplica cuando se realiza un intento de "salir del sistema" o "cambiar contextos".

NB allow_url_fopen establecido en On en el contexto de la línea de comando (es decir, /etc/php/7.0/cli/php.ini ) es lo que tenía en mi sistema, pero sospecho que no influiría en la explicación que proporcioné, incluso si se estableciera a Off menos que, por supuesto, esté probando ejecutando los guiones desde la línea de comando. No allow_url_fopen el comportamiento con allow_url_fopen establecido en Off en el contexto de la línea de comando.


$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.your_external_website.com"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($ch); curl_close($ch);

es mejor para http url, pero cómo abrir https url ayúdame