file_get_contents () отключено для моего собственного сайта

Я пытаюсь подключиться к своему сайту, используя функцию CURL и PHP file_get_contents (), чтобы получить исходный код моей веб-страницы без успеха. Я запускаю PHP-скрипт на том же сервере, с которого я пытаюсь получить исходный код HTML. CURL не возвращает никаких ошибок, даже при использовании curl_error (), а функция PHP file_get_contents () возвращает следующее:

Предупреждение: file_get_contents ([sitename]) [function.file-get-contents]: не удалось открыть поток: соединение отклонено в [путь к файлу] в строке 19.

Я понятия не имею, почему это так. Почему сервер активно отказывается от этого соединения? Как я могу остановить его?

благодаря

РЕДАКТИРОВАТЬ:

Для справки вот мой (cURL) код:

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

Посмотрите настройки вашего брандмауэра, они могут быть слишком строгими. Что произойдет, если вы входите в систему и

 telnet localhost 80 

или эквивалент для вашего выбора? И попробуйте то же самое не с localhost, а с полным ip вашего сервера. Только если это удастся, у вас проблема с curl / php.

edit: ok, поэтому соединение с localhost работает, используя file_get_contents("http://localhost/"); ,

Это означает, что вы можете получить доступ к сайту через localhost, но вам необходимо переопределить поле Host: отправленное с запросом. Это не совсем нормальное использование cURL, но вы можете попробовать:

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

при запросе URL http://127.0.0.1/ . Интересно, будет ли это понято закруткой, но вы можете дать ему шанс.

edit ^ 2: Если это не помогает обмануть cURL, просто откройте собственное сокетное соединение и сделайте свой собственный запрос:

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

(это адаптация из примера php.net)

Скорее всего, потому, что ваш сайт указывает на общедоступный IP-адрес, который, в свою очередь, отображается на внутренний IP-адрес, как указано в mvds.

http://www.domain.com = 234.234.234.234

сервер ip: 10.0.0.1

брандмауэр карты 234.234.234.234 -> 10.0.0.1 из внешних сетей, но не из внутреннего трафика.

Следовательно, вам необходимо подключиться к вашей машине с локальным IP-адресом или localhost ( 127.0.0.1 ), но при этом сохранить заголовок хоста ( www.domain.com ).

Ваши варианты:

  1. Сделайте свой провайдер правильной маршрутизацией для своих внешних IP-адресов в своем брандмауэре. Это выполнимо, но часто пропущено, так как это редко необходимо. Один из аргументов заключается в том, что вы не можете получить доступ к другим сайтам, которые находятся в том же сегменте сети, что и вы сегодня.

  2. Сообщите своему провайдеру добавить http://www.domain.com -> 127.0.0.1 в файл hosts на вашем сервере

  3. Используйте свой собственный код сокета, чтобы «подделать» заголовок хоста, все еще подключаясь к localhost. В PHP есть много примеров классов, и mvds уже дал вам пример.

  4. Найдите другой способ получения информации. Это на том же сервере, не так ли? Получение его по http кажется излишним …

Вся проблема заключалась в том, чтобы добавить эту строку в файл hosts (/ etc / hosts)

 127.0.0.1 example.com www.example.com 

Благодаря джиши! 🙂

Убедитесь, что вы allow_url_fopen из своего php.ini.

Возможно, это глупый вопрос, но у вас нет набора настроек .htaccess? Если ваш браузер хранит его, вы можете забыть, но сервер PHP его не имеет, но ему все равно понадобится доступ к сайту. Почти наверняка нет, но, возможно, стоит предложить.

Раньше у меня была эта проблема при использовании общего сервера с хостинговой компанией, так как многие функции отключены. Вы на общем сервере / бесплатно получаете свой хостинг?

Проверьте, включен ли cURL на вашем сервере в вашей конфигурации PHP.

 <?php // Show all information phpinfo(); ?> 

Если данные, которые вы пытаетесь получить, находятся на одном сервере, вы можете использовать fopen:

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

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

Самый простой способ получить локальный файл – использовать локальный путь.

 file_get_contents('/home/usr/public_html/path/page.html'); 

Путь имени файла изменится с одного сервера на другой, но вы должны получить эту идею.

На моем пути «/ usr /» является именем пользователя для учетной записи.

Если скрипт находится в том же каталоге страницы, вы можете использовать:

 file_get_contents('page.html');