fopen et hosts

Eléphanteau du PHP | 14 Messages

06 juin 2007, 15:33

Bonjour à tous,

je dois ouvrir un fichier distant, via une url http://zla.example.com
Le hic est que cette url est reliée à une ip dans mon fichier Host.

Et afin de pouvoir ouvrir correctement ce fichier distant je dois arriver sur le serveur via l'url et non l'ip.
Y a t-il une config à faire prendre à php (ou apache) pour qu'il arrive à ouvrir cette url grâce au host ?

Ou alors peut-être via une info passée en header ?

Merci d'avance.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 juin 2007, 15:46

Je ne comprends pas. Tu possèdes une entrée dans ton fichier "hosts" (/etc/hosts ? c'est quoi ce fichier ?) pour le nom de domaine "zla.example.com" et tu veux ouvrir l'URL "http://zla.example.com" en utilisant une autre IP que celle de ton fichier "hosts" ? J'ai bien peur que cela soit impossible avec fopen(). Peut-être en cherchant chez curl_setopt(), sinon ta seule solution serait de faire ton propre agent HTTP, mais c'est pas top-top.

Eléphanteau du PHP | 14 Messages

06 juin 2007, 15:50

en fait je suis sous windows et dans "system32/drivers/etc/hosts"
j'ai une entrée xxx.xxx.xxx.xxx zla.exemple.com

je tente de faire un fopen sur par exemple :
http://zla.exemple.com

et il me renvoie :

Code : Tout sélectionner

php_network_getaddresses: getaddrinfo failed: Hôte inconnu
ce qui me laisse à penser que le serveur (apache/php) ne trouve pas le serveur zla.exemple.com et que donc la résolution via le fichier Host ne se fait pas.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 juin 2007, 15:59

A priori c'est une erreur de Windows car j'utilise un fichier "hosts" moi-même (sous Windows, et sous Linux) et je n'ai jamais eu de problème du genre (et j'utilise beaucoup de vhosts pour mes tests). L'IP utilisée par fopen() est bien celle du fichier "hosts".

À part ça, j'ai testé une solution utilisant les "stream wrappers" et finalement c'est beaucoup plus facile que ce que je pensais. On peut faire quelque chose comme
echo file_get_contents('http://127.0.0.1/phpinfo.php', false, stream_context_create(array(
	'http'	=>	array(
		'header'	=>	'Host: zla.example.com'
	)
)));
...ce qui équivaudrait à mettre

Code : Tout sélectionner

127.0.0.1 zla.example.com
...dans ton fichier "hosts". Clique sur les fonctions pour aller sur la page du manuel correspondante.

Eléphanteau du PHP | 14 Messages

06 juin 2007, 16:01

Super merci je tente ca !

Eléphanteau du PHP | 14 Messages

06 juin 2007, 16:06

Hum sauf que ca ne marche pas... Même erreur...
En tout cas c'est une piste.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 juin 2007, 16:32

Le problème c'est que pour ce type d'usage, le message d'erreur que tu cites est impossible donc le problème doit venir d'ailleurs. Poste le bout de code en question pour voir ?

Eléphanteau du PHP | 14 Messages

06 juin 2007, 16:43

Je reprends exactement le code que tu as posté.

Mais j'ai effectué davantage de tests, et si par exemple j'essaye de taper sur google, j'obtiens la même erreur.
Sauf que dans le cas de google c'est compréhensible puisque je suis derrière un proxy.

La machine zla.example.com elle est sur mon réseau interne.
Et par opposition j'arrive tout à fait a taper d'autres machines du réseau.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 juin 2007, 18:36

je suis derrière un proxy.
Stoooooooooooop. Si tu es derrière un proxy c'est le proxy qui s'occupe de la traduction des noms d'hôtes à partir de l'en-tête "Host". Il te faut donc changer le fichier "hosts" du proxy pour pointer là où tu veux.

Eléphanteau du PHP | 14 Messages

07 juin 2007, 09:13

Sauf que dans ce cas ci, cela ne doit pas passer par le proxy, d'ailleurs je ne lui indique nulle part une éventuelle adresse de proxy. enfin je crois ...

Mammouth du PHP | 505 Messages

07 juin 2007, 09:33

Si tu es derrière un proxy, dans ton navigateur tu as certainement configurer l'acces via proxy pour http.
sous firefox, outils/options/avancé/reseau/parametre,
sous ie outils/options/connexions/parmetre reseau local

Dans cette meme zone, tu as une liste d'exclusion (pas de proxy pour...), il faut mettre dedans non pas l'ip mais le hostname tel que que tu l'as définie dans ton fichier host. en l'occurence, zla.example.com dans ton cas.

Essai ca, si ca suffit pas, on creusera plus loins

Eléphanteau du PHP | 14 Messages

07 juin 2007, 09:47

Ce site est deja dans l'exclusion proxy.

Je n'aurai pas cru que php se servait des parametres du navigateur.

Mammouth du PHP | 505 Messages

07 juin 2007, 10:58

Ah, non, autant pour moi. Le serveur php n'a aucune connaissance du parametrage du proxy du navigateur.

coté php.ini, je pense que tu as déjà mis allow_url_fopen = On

J'ai moi meme un proxy, je viens de faire un test,


$f = fopen('http://www/test.log','r');
$d = fread($f,5000);
echo $d;
fclose($f);
mon apache est local, www est sur le loopback dans le host windows, pas de conf particulière, et ca lit bien le fichier

test.log est a la racine du vhost www.

molokoloco
Invité n'ayant pas de compte PHPfrance

14 juin 2007, 18:46

oui... apparement depuis php5 les fonctions file, fileGetContent... ne marche plus bien sous windows...

=> php_network_getaddresses: getaddrinfo failed: Hôte inconnu.

Cela marche en appelant les sites par les adresses IP... :-/

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 juin 2007, 20:42

Tiens, je n'avais pas remarqué que ce sujet avait été mis à jour. Oops.
Sauf que dans ce cas ci, cela ne doit pas passer par le proxy, d'ailleurs je ne lui indique nulle part une éventuelle adresse de proxy. enfin je crois ...
Euh, vérifie ton php.ini. Fais un file_get_contents('http://www.adresseip.com']) et vois l'IP qui est affichée. Si tu n'utilises effectivement pas de proxy, essaie le code que j'ai proposé plus haut tout seul dans un script:
<?php
echo file_get_contents('http://127.0.0.1/phpinfo.php', false, stream_context_create(array( 
    'http'    =>    array( 
        'header'    =>    'Host: zla.example.com' 
    ) 
)));
?>
Et si ça ne marche toujours pas, regarde du côté de http://bugs.php.net/ parce que c'est certainement un bug.
Cela marche en appelant les sites par les adresses IP... :-/
Justement, dans mon exemple on n'utilise que l'adresse IP donc je ne comprends pas.