web-dev-qa-db-fra.com

file_get_contents - échec de l'ouverture du flux: la requête HTTP a échoué! HTTP/1.1 404 Introuvable

J'ai des problèmes étranges avec file_get_contents après avoir déplacé mon site vers un nouveau domaine. Je devais configurer un nouveau domaine et une nouvelle adresse IP (avec Plesk) pour faire fonctionner un nouveau certificat SSL. Maintenant, mon file_get_contents appelant un script sur le même domaine me donne ceci:

impossible d'ouvrir le flux: la requête HTTP a échoué! HTTP/1.1 404 Introuvable

Si j'appelle la même URL en utilisant file_get_contents sur un autre serveur, cela fonctionne correctement et si j'appelle www.google.com à partir du serveur, c'est un échec qui fonctionne.

J'ai le sentiment que cela pourrait avoir quelque chose à voir avec deux adresses IP avec deux certificats SSL différents sur le même serveur. de sorte que c'est comme Apache n'est pas à la recherche du bon hôte virtuel quand il appelle à partir de son propre serveur.

Pour clarifier (espérons-le!):

Sur le serveur hébergeant le domaine:

file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');

donne "échec de l'ouverture du flux: échec de la requête HTTP! HTTP/1.1 404 non trouvé"

file_get_contents('http://www.google.com');

fonctionne correctement

Sur un autre serveur:

file_get_contents('https://mydomain.com?limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12');

fonctionne bien.

J'ai essayé de désactiver SSL et j'ai toujours le même problème.

15
user1250758

J'ai aussi eu ce problème quand je travaille sur un petit serveur de test à la maison. Le nom de domaine est résolu en votre adresse IP externe et une demande est envoyée. Mais comme la demande provient de votre réseau, le routeur ne la reconnaît pas comme une demande normale. Il dispose probablement d'une interface Web pour la configurer et tente de renvoyer une page à partir de son propre système de gestion, qui n'est alors pas trouvé dans le chemin que vous avez spécifié.

Dans ce cas, je travaillais sur un PC Windows et je pouvais le résoudre en ajoutant le domaine que je testais à mon fichier hosts, en spécifiant 127.0.0.1 comme adresse IP (ou l'adresse IP du serveur, le cas échéant). est une autre machine du même réseau). Sous Linux, il devrait y avoir une solution similaire, je pense. 

Le problème n'est pas PHP ni votre serveur, mais votre routeur.

5
GolezTrol

La plupart des hébergeurs proposent maintenant de bloquer le paramètre furl_open qui vous permet d’utiliser file_get_contents() pour charger des données à partir d’une URL externe.

Vous pouvez utiliser CURL ou une bibliothèque client PHP telle que Guzzle

Essayez de faire ceci:

file_get_contents('https://mydomain.com?'.urlencode('limit=4&offset=0&s_date=2012-02-05&e_date=2012-03-13&order=release_date&dir=desc&cid=12'));
0
Abdelali AHBIB

Si vous avez juste besoin de gérer l'avertissement lorsque l'URL est introuvable (comme je l'ai fait), vous pouvez simplement le faire pour transformer Avertissements en Exceptions:

set_error_handler(
  function ($err_severity, $err_msg, $err_file, $err_line, array $err_context) {
    // do not throw an exception if the @-operator is used (suppress)
    if (error_reporting() === 0) return false;

    throw new ErrorException( $err_msg, 0, $err_severity, $err_file, $err_line );
  },
  E_WARNING
);
try {
  $contents = file_get_contents($your_url);
} catch (Exception $e) {
  echo $e->getMessage();
}
restore_error_handler();

Solution basée sur ce thread/question .

0
CPHPython