7
votes

File_Get_Contents () Connexion refusée pour mon propre site

J'ai essayé de vous connecter à mon propre site en utilisant la fonction CURL et la fonction PHP File_Get_Contents () pour obtenir la source de ma page Web sans succès. J'exécute le script PHP sur le même serveur que j'essaie d'obtenir la source HTML. Curl ne renvoie aucune erreur, pas même lorsque vous utilisez Curl_Error () et la fonction PHP File_Get_Contents () renvoie ce qui suit:

AVERTISSEMENT: FILE_GET_CONTENTS ([[SITENNAME]) [Fonction.File-get-Contenu]: Échec de l'ouverture du flux: Connexion refusée dans [Chemin de fichier] sur la ligne 19. P> blockQuote>

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

Merci P>

EDIT: P>

Pour référence Voici mon code (CURL): P>

$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 commentaires

7 Réponses :


9
votes

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

$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);
}


20 commentaires

+1 - Normalement localhost fonctionnerait, mais en utilisant souvent le nom du serveur ou la propriété intellectuelle. De nombreux pare-feu / routeurs ne permettront pas de demander des demandes essentiellement «en boucle» à travers le routeur.


J'ai bien peur de ne pas avoir d'accès telnet au serveur Web. Est-ce que là-bas, je peux imiter / tester cela à l'aide de commandes PHP?


Err. . Si vous êtes dans un environnement d'hébergement partagé, vous obtiendrez une réponse d'erreur, mais au moins vous savez que vous avez une connectivité. Donc, par exemple file_get_contents ("http://127.0.0.1/");


Ok, tu as eu. Après votre suggestion, j'ai une page vierge. Aucun message d'erreur, pas de sortie, rien (la déclaration d'erreur est activée).


Vous n'obtenez donc aucune erreur de connexion cette fois-ci? pourrait être votre serveur Web pour le faire lorsqu'il n'est donné aucun nom d'hôte; Que se passe-t-il si vous y accédez à la maison, en utilisant l'adresse IP? I.E. Pointez votre navigateur à http://1.2.3.4/


Désolé, gratter ça. Je reçois une réponse (je n'imprimais pas la sortie, Doh!), Mais ce n'est pas prometteur, tout ce qu'il dit est "Ce nom de domaine a été réservé à l'utilisation future". Je soupçonne que c'est le résultat de moi en utilisant l'hébergement partagé.


Oui, mais il nous dit que vous peut Connectez-vous à localhost . Donc, maintenant, le but est de se connecter à localhost et d'envoyer des boucles ou PHP Envoyer la droite (un peu faux) hôte: champ d'en-tête. Une solution serait d'utiliser un fichier / et hosts , mais je présume des chances que ce soit très mince, vous pourriez le faire (et en outre, cela peut être un peu risqué).


Merci de répondre. Oui, malheureusement, je n'ai pas accès au fichier / etc / hosts sur le serveur Web. Je pense que je pourrais juste avoir à accepter qu'il ne soit pas possible de le faire.


Voir ma réponse mise à jour. Si cela ne fonctionne pas, il y a encore plus de trucs; N'abandonnez pas, vous aurez beaucoup appris au moment de votre travail.


Toujours pas de chance, j'ai mis le code de boucle que j'utilise dans ma question initiale de référence. Tout ce que je reçois, c'est une page vierge.


vient d'ajouter un exemple de prise; Vous pouvez sauter des trucs préfabriqués et simplement vous connecter vous-même. Faites attention à la forme précise de la demande, car il est facile de casser!


Pas de chance, j'ai peur, toujours une sortie vierge. À court d'idées encore? ;)


Vous avez fait echo $ résultat; ? aucune erreur que ce soit? ERROR_REPORTATION (~ 0) En haut de votre fichier?


Ah j'en ai un de ces jours. Impression du résultat fait le tour! Merci beaucoup pour votre aide!


Existe-t-il des problèmes de codage de contenu que je devrais être au courant lorsque vous utilisez des sockets? Je reçois exactement la même sortie que je voudrais en visitant la page dans le navigateur mais JSON_Decode () ne fonctionne pas. Beirdly, il retourne la même valeur que je passe à elle.


Aucune question à laquelle je pense, vous obtenez les octets bruts de la prise, mais que fait incluent l'en-tête de réponse HTTP. Avez-vous coupé ça? Essayez Liste ($ Headers, $ corporelle) = exploser ("\ r \ n \ r \ n", $ résultat, 2);


Oui j'ai coupé les en-têtes. Hmm je ferai d'autres enquêtes demain. Merci encore pour votre aide.


Faites attention à un codage chunté BTW, cela donnera un bruit de bruit dans votre contenu s'il n'est pas manipulé correctement (certains numéros hexagonales courts, ne peuvent pas manquer)


Réussi à le réparer. Pour une raison quelconque, un groupe de caractères spéciaux était dans la chaîne, ce code dans les commentaires de la page PHP JSON_DECODE a fait l'astuce: Preg_replace ('/ [\ x00- \ x1f \ x80- \ xff] /' ',' ', $ JSON);


bien joué. Mais simplement supprimer des caractères de votre contribution n'est guère une solution; Vous devez examiner le problème de codage, en utilisant iconv ou mb_convert_encoding pour tester et / ou convertir les codages (puis peut-être ouvrir une autre question ;-)



0
votes

J'ai déjà eu ce problème lors de l'utilisation d'un serveur partagé avec une société d'hébergement, autant de fonctionnalités éteintes. Ê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. P>

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


6 commentaires

Curl est activé car il fonctionne avec d'autres sites. Et en effet, j'utilise l'hébergement partagé que je suppose que c'est pourquoi cela ne fonctionne pas.


Oui, je semble me souvenir d'avoir 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.


A peur non, comme je suis après la sortie, pas le contenu.


HMM, la seule autre méthode que je peux voir consiste à utiliser un fichier PHP, puis appelez directement les fonctions directement. Je pense vraiment que vous avez besoin de courboire pour pouvoir faire ce que vous dites. La demande peut-être d'être allumée par votre fournisseur d'hébergement?


Hmm, je pourrais peut-être essayer y compris. Ce serait un peu un corps cependant. Merci pour votre aide quand même.


Pas de problème, désolé je ne pouvais pas aider davantage.



0
votes

Assurez-vous que vous avez allecter_url_fopen est allumé de votre php.ini.


0 commentaires

0
votes

Peut-être une question stupide, mais vous n'avez pas de jeu de mots de passe .htaccess. Si votre navigateur le stocke, vous pouvez oublier, mais le serveur PHP ne l'a pas, mais il en aurait toujours besoin pour accéder au site. Presque certainement pas, mais peut-être la peine d'être suggéré.


1 commentaires

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



6
votes

La plupart éventuellement parce que votre site est dirigé vers une adresse IP publique, ce qui est mappé à une adresse IP interne comme MVDS pointée.

www.domain.com = 234.234.234.234

IP du serveur: 10.0.0.1

Cartes de pare-feu 234.234.234.234 -> 10.0.0.1 des réseaux extérieurs, mais pas du trafic interne.

Par conséquent, vous devez vous connecter à votre machine avec l'adresse IP locale, ou localhost ( 127.0.0.1 ) mais maintienne toujours l'en-tête d'hôte ( www.domain.com ).

Vos options sont:

  1. Faites de votre configuration de votre fournisseur CORRECTEMENT ACHETE POUR LANDE EXTERNES IPS DANS LE PAREWALL. C'est faisable mais souvent manqué car il est rarement nécessaire. Un argument de travail pour que cela fonctionne est 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-code pour "FAIN" L'en-tête d'hôte tout en vous connectant à localhost. Il y a beaucoup d'exemple de classes pour cela dans PHP et MVDS vous a déjà donné un exemple.

  4. trouver une autre façon d'aller chercher les informations. C'est sur le même serveur, n'est-ce pas? La récupération de HTTP semble redondante ...


2 commentaires

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


AD 4) Un piratage vraiment laid (mais efficace) doit définir € _ obtenir [...] = ... à quels paramètres dont vous avez besoin, puis inclure un fichier.



4
votes

Le problème total était d'ajouter cette ligne au fichier hôte (/ etc / hosts) xxx

grâce à Jishi! :)


0 commentaires

2
votes

Le moyen le plus simple de récupérer un fichier local est l'utilisation du chemin local.

file_get_contents('page.html');


0 commentaires