[PHP] file_get_contents mais qui retourne la page générée (via HTTP)

Problème de chemin d'accès relatif vs absolu

Le problème exposé dans ce sujet a été résolu.

Bonjour,

j’ai un script très simple : $contenu = file_get_contents('cible.php');

Mais comme dans cible.php il y a du code PHP, le contenu de $contenu est (en gros) :

<?php $h = 'Salut'; ?>
<h1><?php echo $h; ?></h1>

Moi je veux que le code PHP soit d’abord interprété. Vous voyez le problème ?

Donc ma "solution" - qui marche en local - c’est de balancer l’adresse absolue (l’URL HTTP(s) complète quoi :B ).

Ce qui me donne : $contenu = file_get_contents('https://zestedesavoir.com/cible.php'); (c’est pas ZdS en vrai :p )

Ça "marche" en local.

Là où ça foire (maudit PHP… ou Apache) !

PROBLÈME : En remote, sur mon "vrai" serveur, le dossier comprenant cible.php est protégé par .htaccess et donc seule mon IP a le droit d’y accéder. Du coup je tombe sur une erreur 403.

J’ai essayé d’ajouter 127.0.0.1 dans la liste des IPs autorisés (c’est pas une très bonne pratique, mais je suis un peu pressé lol :p) mais même là, ça marche pas. Toujours 403. Je comprends pas vraiment pourquoi d’ailleurs.

La seule manière de le faire fonctionner est de désactiver/ré-activer manuellement le .htaccess à chaque fois que je veux lancer le script. Pas pratique mais ça permet de voir que c’est bien de là que viennent les 403, et ce malgré le 127.0.0.1 autorisé en principe.

Donc je me suis dit que ma "solution" initiale, mettre l’adresse absolue dans le file_get_contents, n’était pas la bonne.

Retour à la case départ, j’aimerais pouvoir faire $contenu = file_get_contents('cible.php'); mais avoir le code de cible.php exécuté justement pour pas avoir de code PHP dans ma variable $contenu.

Merci beaucoup pour votre aide,

PS: Une dernière chose, j’aimerais si possible éviter de passer par les include / require. La raison est que le script et le fichier cible.php ont volontairement été simplifiés pour ce topic, mais en réalité ils contiennent beaucoup de code donc ça va être galère à faire. Je vois à peux prêt comment procéder, mais je cherche une alternative.

Merci encore ! :D

+0 -0

Alors je crois que tu mélanges les concepts : tu ne cherches pas à récupérer le contenu du fichier, mais le document généré par un script PHP.

Idéalement, comme tu l’as compris, il faut passer par une requête HTTP et non lire le contenu du fichier local (qui ne sera donc pas interprété puisque tu ne passes pas par le serveur qui s’en charge).

As-tu regardé du côté d’Apache l’IP utilisée lorsque tu fais ton appel (actuellement bloqué par le .htaccess) plutôt ?

Note : utiliser include/require n’aidera en rien vu que c’est pour importer des fichiers PHP, et non leur résultat. Il faut absolument que le PHP soit interprété si tu veux son résultat.

J’avais pas compris la demande… Un peu farfelue haha, bien vu @viki53 .

Concrètement, si tu veux exécuter le contenu des fichiers avant d’en récupérer le résultat… Exécuter puis récupérer reviendra strictement au même qu’utiliser include.

Mais cela-dit, il est totalement possible d’utiliser include contrairement à ce que semble suggérer @viki53. En voici un exemple:

<?php
// fichier index.php
$acme = 'Coucou';
$contenu = include('foo.php');
<?php /* Fichier foo.php */ ?>
<p><?php index.php ?></p>

L’exécution de la commande php index.php renvoie bien le résultat de l’exécution du fichier foo.php.


Pour ce qui est de l’erreur 403 pour moi il n’y a aucun rapport avec PHP lui même, on parle d’un problème de configuration apache. Mais cela-dit tu ne nous donne aucune info sur ta config donc on ne risque pas de pouvoir t’aider…

J’ai trouvé où ça coinçait.

Comme @viki53 le suggérait, ça venait de l’IP d’Apache.

J’avais déjà eu un doute, donc j’avais mis en plus de 127.0.0.1 l’adresse IP du serveur (le $_SERVER['SERVER_ADDR']). Ce qui revient au même :B

Mais en fait, en vérifiant avec un $_SERVER['REMOTE_ADDR'] dans cible.php, c’est pas la même IP qui fait la requête. Peut-être que ça vient du fait que c’est un hébergement mutualisé.

Après pour le include ça marche, et je pense qu’en théorie ce serait même préférable à ce que je fais, mais ça m’obligerait à revoir tout le code justement du fait de l’exécution partagée :p

Merci à vous deux !

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte