web-dev-qa-db-fra.com

PHP ini file_get_contents url externe

J'utilise la fonction PHP suivante:

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

Chaque fois que je fais cela sur un certain serveur, le résultat est vide. Quand je le fais ailleurs, le résultat est quel que soit le contenu de la page. Cependant, lorsque je, sur le serveur où le résultat est vide, utilise la fonction localement - sans accéder à une URL externe (file_get_contents('../simple/internal/path.html');), cela fonctionne fonctionne.

Maintenant, je suis sûr que cela a quelque chose à voir avec une certaine configuration de php.ini. Ce dont je ne suis cependant pas sûr, c'est qui un. Veuillez aider.

38
arik

Le paramètre que vous recherchez est allow_url_fopen .

Vous avez deux façons de le contourner sans modifier php.ini, l'une d'elles consiste à utiliser fsockopen() , et l'autre à utiliser cURL .

Je recommande de toute façon d'utiliser cURL sur file_get_contents(), car il a été conçu pour cela.

40
Aillyn

En complément de la réponse d'Aillyn, vous pouvez utiliser une fonction comme celle ci-dessous pour imiter le comportement 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');
31
Pablo
$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);

est le meilleur pour l'url http, mais comment ouvrir l'url https m'aider

4
Vikash

Le est lié au paramètre de configuration ini allow_url_fopen .

Vous devez savoir que l'activation de cette option peut rendre certains bogues de votre code exploitables.

Par exemple, cette incapacité à valider l'entrée peut se transformer en une vulnérabilité d'exécution de code à distance à part entière:

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

Les réponses fournies ci-dessus résolvent le problème mais n'expliquent pas le comportement étrange décrit par l'OP. Cette explication devrait aider quiconque teste la communication entre les sites dans un environnement de développement où ces sites résident tous sur le même hôte (et le même hôte virtuel; je travaille avec Apache 2.4 et php7.0).

Il y a une subtilité avec file_get_contents() Je suis tombé sur ce qui est absolument pertinent ici mais sans réponse (probablement parce que c'est à peine documenté ou non documenté d'après ce que je peux dire ou est documenté dans un livre blanc sur un modèle de sécurité php obscur que je ne peux pas trouver).

Avec allow_url_fopen Réglé sur Off dans tous les contextes pertinents (par exemple /etc/php/7.0/Apache2/php.ini, /etc/php/7.0/fpm/php.ini, Etc ...) et allow_url_fopen Réglé sur On dans le contexte de la ligne de commande (ie /etc/php/7.0/cli/php.ini), les appels à file_get_contents() pour une ressource locale seront autorisés et aucun avertissement ne sera enregistré tel que:

file_get_contents('php://input');

ou

// 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>');

ou

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

Pour conclure, la restriction allow_url_fopen = Off Est analogue à une règle iptables dans la chaîne OUTPUT, où la restriction n'est appliquée que lorsqu'une tentative de "quitter le système" ou "changer contextes "est créé.

N.B. allow_url_fopen Défini sur On dans le contexte de la ligne de commande (c'est-à-dire /etc/php/7.0/cli/php.ini) Est ce que j'avais sur mon système, mais je soupçonne que cela n'aurait aucune incidence sur l'explication que j'ai fournie même si il a été défini sur Off sauf si vous testez bien sûr en exécutant vos scripts à partir de la ligne de commande elle-même. Je n'ai pas testé le comportement avec allow_url_fopen Défini sur Off dans le contexte de la ligne de commande.

2
J-a-n-u-s

Cela donnera également aux liens externes un chemin absolu sans avoir à utiliser 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
?>
1
Wayne Nort

Ajouter:

allow_url_fopen=1

dans votre php.ini fichier. Si vous utilisez l'hébergement partagé, créez-en un d'abord.

0
Cheap PC Shop