2010-07-19 9 views
5

J'ai essayé de me connecter à mon propre site en utilisant à la fois CURL et la fonction PHP file_get_contents() pour obtenir la source de ma page Web sans succès. Je cours le manuscrit de PHP sur le même serveur que j'essaye d'obtenir la source HTML. CURL ne renvoie aucune erreur, pas même lorsque vous utilisez la fonction curl_error(), et les file_get_contents PHP() renvoie les éléments suivants:file_get_contents() connexion refusée pour mon propre site

Attention: file_get_contents ([nom du site]) [function.file-get-contents] : n'a pas réussi à ouvrir le flux: Connexion refusée dans [chemin du fichier] sur la ligne 19.

Je ne sais pas pourquoi c'est. Pourquoi un serveur refuserait-il activement cette connexion? Comment puis-je l'arrêter?

Merci

EDIT:

Pour référence ici est 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; 
+0

Quel protocole utilisez-vous? –

+0

J'utilise le protocole HTTP. – CJD

Répondre

9

Jetez un oeil à vos paramètres de pare-feu, ils peuvent être un peu trop stricte. Que se passe-t-il si vous vous connectez et

telnet localhost 80 

ou l'équivalent pour votre OS de choix? Et essayez la même chose avec localhost mais l'ip complète de votre serveur. Seulement si cela réussit, vous avez un problème curl/php.

modifier: ok, donc la connexion à localhost fonctionne, en utilisant file_get_contents("http://localhost/");. Cela signifie que vous pouvez accéder à votre site via localhost, mais vous devez remplacer le champ Host: envoyé avec la demande. Ce n'est pas exactement usage normal de cURL, mais vous pouvez essayer:

curl_setopt(CURLOPT_HTTPHEADER,array('Host: yourdomain.com')); 

en demandant URL http://127.0.0.1/. Je me demande si cela sera compris par curl mais vous pouvez essayer.

modifier^2: Si cela ne fonctionne pas pour tromper cURL, il suffit d'ouvrir votre propre connexion socket et faire votre propre demande:

$ip = '127.0.0.1'; 
$fp = fsockopen($ip, 80, $errno, $errstr, 5); 
$result = ''; 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET/HTTP/1.1\r\n"; 
    $out .= "Host: www.exampl.com\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     $result .= fgets($fp, 128); 
    } 
    fclose($fp); 
} 

(ceci est une adaptation d'un exemple de php.net)

+0

+1 - Normalement 'localhost' fonctionnerait, mais il ne le serait pas souvent en utilisant le nom du serveur ou l'adresse IP publique. De nombreux pare-feu/routeurs n'autoriseront pas les demandes qui "rebouclent" essentiellement via le routeur. –

+0

Je crains de ne pas avoir accès au telnet sur le serveur web. Y at-il de toute façon je peux émuler/tester cela en utilisant des commandes PHP? – CJD

+0

err .. c'est essentiellement ce que vous faites ;-) Essayez de vous connecter à localhost (ou '127.0.0.1' ou' 0.0.0.0', tout de même) et voyez ce qui se passe. Si vous êtes dans un environnement d'hébergement partagé, vous obtiendrez une réponse erronée, mais au moins, vous savez que vous avez une connectivité. Donc, par exemple 'file_get_contents (" http://127.0.0.1/ ");' – mvds

0

J'ai déjà eu ce problème lors de l'utilisation d'un serveur partagé avec une société d'hébergement, car de nombreuses fonctionnalités sont désactivées. Êtes-vous sur un serveur partagé/obtenez-vous votre hébergement gratuitement?

Vérifiez si cURL est également activé sur votre serveur dans votre configuration PHP.

<?php 

// Show all information 
phpinfo(); 

?> 

Si les données que vous tentez d'accéder est sur le même serveur, vous pouvez utiliser fopen:

$myFile = "testFile.txt"; 
$fh = fopen($myFile, 'r'); 
$theData = fread($fh, 5); 
fclose($fh); 
echo $theData; 

http://php.net/manual/en/function.fopen.php

+0

CURL est activé car il fonctionne avec d'autres sites. Et en effet, j'utilise l'hébergement partagé qui, je suppose, est la raison pour laquelle cela ne fonctionne pas. – CJD

+0

Oui, je me souviens d'avoir exactement le même problème sur mon hôte partagé. Je ne sais pas si vous l'avez déjà considéré, mais vous pouvez utiliser fopen à la place? J'ai édité mon post ci-dessus. –

+0

Peur pas, comme je suis après la sortie, pas le contenu. – CJD

0

Peut-être une question stupide, mais vous ne disposez pas d'un mot de passe .htaccess défini? Si votre navigateur le stocke, vous pourriez l'oublier, mais le serveur PHP ne l'a pas mais en aura toujours besoin pour accéder au site. Presque certainement pas, mais peut-être mérite d'être suggéré.

+0

Merci pour la suggestion, mais hélas non, je n'ai pas de protection par mot de passe sur l'URL racine. – CJD

5

Très probablement parce que votre site est pointé vers une adresse IP publique, qui à son tour est mappée à une adresse IP interne comme mvds a souligné.

www.domain.com = 234.234.234.234

ip du serveur: 10.0.0.1

cartes pare-feu 234.234.234.234 -> 10.0.0.1 de réseaux extérieurs, mais pas de trafic interne. Par conséquent, vous devez vous connecter à votre machine avec l'adresse IP locale ou locale (127.0.0.1) tout en conservant l'en-tête de l'hôte (www.domain.com).

Vos options sont:

  1. Faites votre configuration du fournisseur de routage correct pour leurs adresses IP externes dans leur pare-feu. C'est faisable mais souvent manqué puisque c'est rarement nécessaire. Un argument pour que cela fonctionne est parce que vous ne pouvez pas accéder à d'autres sites qui résident sur le même segment de réseau que vous aujourd'hui.

  2. Dites à votre fournisseur d'ajouter www.domain.com ->127.0.0.1 dans le fichier hosts sur votre serveur

  3. Utilisez votre propre code socket à « faux » l'hôte en-tête tout en continuant à toucher localhost . Il y a beaucoup de classes d'exemples pour cela en PHP et mvds vous a déjà donné un exemple.

  4. Trouvez un autre moyen de récupérer l'information. C'est sur le même serveur, n'est-ce pas? Récupérer par http semble redondante ...

+0

Merci pour l'explication détaillée et des conseils. – CJD

+0

ad 4) un bidouillage vraiment moche (mais efficace) consiste à mettre '$ _GET [...] = ...' sur les paramètres dont vous avez besoin, puis 'include' un fichier. – mvds

3

Tout le problème était d'ajouter cette ligne dans le fichier hosts (/ etc/hosts)

127.0.0.1 example.com www.example.com 

Merci à Jishi! :)

0

La façon la plus simple de récupérer un fichier local est d'utiliser le chemin local. Le chemin du nom de fichier changera d'un serveur à l'autre, mais vous devriez avoir l'idée.

Dans mon chemin le "/ usr /" est le nom d'utilisateur pour le compte.

Ou si vous script est dans le même répertoire de la page, vous pouvez utiliser:

file_get_contents('page.html'); 
Questions connexes