file_get_contents() connexion refusée pour mon propre site
J'ai essayé de me connecter à mon propre site à l'aide de deux CURL et PHP file_get_contents() fonction permettant d'obtenir la source de ma page web, sans succès. Je suis en cours d'exécution du script PHP sur le même serveur que j'essaie d'obtenir le source HTML de. CURL n'a pas de retour de toutes les erreurs, même pas lors de l'utilisation de curl_error(), et le PHP file_get_contents() renvoie la suivante:
Warning: file_get_contents([sitename]) [function.file-get-contents]: failed to open stream: Connexion refusée dans [chemin fichier] sur la ligne 19.
Je n'ai aucune idée pourquoi. Pourquoi un serveur activement refuser cette connexion? Comment puis-je l'arrêter?
Grâce
EDIT:
Pour référence, voici mon cURL () code:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.mydomain.co.uk');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, '');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: www.mydomain.co.uk'));
$rawHTML = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
print $err;
print 'HTML: ' . $rawHTML;
Vous devez vous connecter pour publier un commentaire.
Regarder vos paramètres de pare-feu, ils ont peut-être un peu trop stricte. Qu'advient-il si vous vous connectez et
ou l'équivalent pour votre système d'exploitation de choix? Et essayez même pas avec localhost, mais le full ip de votre serveur. Que si elle réussit, vous avez un curl/php problème.
edit: ok, une connexion à
localhost
fonctionne, en utilisantfile_get_contents("http://localhost/");
.Cela signifie que vous pouvez accéder à votre site par le biais de localhost, mais vous devez remplacer la
Host:
champ envoyé avec la demande. Ce n'est pas exactement l'utilisation normale de roulage, mais vous pouvez essayer:tout en demandant URL
http://127.0.0.1/
. Je me demande si cela sera compris par curl, mais vous pouvez donner un coup de feu.modifier^2: Si cela ne fonctionne pas pour tromper cURL, il suffit d'ouvrir votre propre connexion de socket et de faire votre propre demande:
(c'est une adaptation d'un php.net exemple)
localhost
marcherait, mais souvent en utilisant le nom du serveur ou adresse IP publique ne serait pas. De nombreux pare-feu et des routeurs ne permettent pas de demandes que l'essentiel de la "boucle de retour" à travers le routeur.127.0.0.1
, ou0.0.0.0
, tout de même) et voir ce qui se passe. Si vous êtes dans un environnement d'hébergement partagé, vous obtiendrez une erreur de réponse, mais au moins vous savez que vous avez la connectivité. Ainsi, par exemplefile_get_contents("http://127.0.0.1/");
http://1.2.3.4/
localhost
. Alors maintenant, le but est de se connecter àlocalhost
et ont curl ou php d'envoyer le bon (un peu de faux)Host:
champ d'en-tête. Un autre moyen serait d'utiliser un/etc/hosts
fichier, mais je présume que les chances sont très minces, vous pouvez le faire (et d'ailleurs c'est peut être un peu risqué).echo $result;
? pas d'erreur quelconque?error_reporting(~0)
en haut de votre fichier?list($headers,$body)=explode("\r\n\r\n",$result,2);
iconv
oumb_convert_encoding
pour tester et/ou de convertir des codages (et puis peut-être en ouvrir une autre question 😉Plus peut-être parce que votre site est orienté vers une adresse ip publique, qui à son tour est mappé à une adresse IP interne comme mvds souligné.
pare-feu de cartes
234.234.234.234 -> 10.0.0.1
de l'extérieur de réseaux, mais pas de trafic interne.Ainsi, vous devez vous connecter à votre machine avec l'adresse IP local, ou localhost (
127.0.0.1
), mais encore de maintenir l'en-tête d'hôte (www.domain.com
).Vos options sont:
Votre fournisseur d'installation de routage correct pour leurs externe IPs dans leur pare-feu. C'est faisable mais souvent oubliée, car il est rarement nécessaire. Un argument pour que cela fonctionne est parce que vous ne pouvez pas accéder à d'autres sites qui réside sur le même segment de réseau que vous aujourd'hui.
Dites à votre fournisseur pour ajouter de la http://www.domain.com ->
127.0.0.1
dans le hébergeurs de fichiers sur votre serveurUtiliser votre propre socket-code pour "de faux" de l'en-tête d'hôte tout en encore de la connexion à localhost. Il existe de nombreux exemples de classes pour cette en PHP et mvds vous a donné un exemple déjà.
Trouver une autre façon de chercher de l'information. C'est sur le même serveur, n'est-ce pas? L'extraction par http semble redondant...
$_GET[...]=...
à ce que les paramètres dont vous avez besoin et ensuiteinclude
un fichier.Le problème consiste à ajouter cette ligne au fichier hosts, /etc/hosts )
Grâce à jishi! 🙂
Assurez-vous que vous avez
allow_url_fopen
activé dans votre php.ini.Probablement une question stupide, mais vous n'avez pas un .htaccess mot de passe défini avez-vous? Si votre navigateur le stockage, vous pouvez l'oublier, mais le serveur PHP ne l'ai pas, mais encore besoin d'elle pour accéder au site. Certainement pas, mais peut-être vaut suggère.
J'ai eu ce problème avant lors de l'utilisation d'un serveur partagé avec une société d'hébergement, que de nombreuses fonctionnalités sont désactivées. Êtes-vous sur un serveur partagé/obtenez-vous votre hébergement gratuit?
Vérifier si cURL est activé sur votre serveur de trop dans votre configuration PHP.
Si les données que vous tentez d'accéder est sur le même serveur, vous pourriez utiliser fopen:
http://php.net/manual/en/function.fopen.php
La façon la plus simple pour récupérer un fichier local est d'utiliser le chemin d'accès local.
Le nom du fichier chemin d'accès va changer à partir d'un serveur à un autre,mais vous devriez obtenir l'idée.
Dans mon chemin d'accès au répertoire "/usr/" est le nom d'utilisateur du compte.
Ou si le script est dans le même répertoire que la page, vous pouvez utiliser: