Отказ в соединении file_get_contents () для моего сайта - PullRequest
6 голосов
/ 19 июля 2010

Я пытался подключиться к своему собственному сайту, используя как 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;

Ответы [ 7 ]

9 голосов
/ 19 июля 2010

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

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/.Интересно, будет ли это понимать curl, но вы можете дать ему шанс.

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)

5 голосов
/ 20 июля 2010

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

www.domain.com = 234.234.234.234

ip сервера: 10.0.0.1

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

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

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

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

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

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

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

4 голосов
/ 12 мая 2011

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

127.0.0.1 example.com www.example.com

Благодаря jishi!:)

0 голосов
/ 13 мая 2016

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

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

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

По моему пути "/ usr /" - это имя пользователя для учетной записи.

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

file_get_contents('page.html');
0 голосов
/ 20 июля 2010

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

0 голосов
/ 20 июля 2010

Убедитесь, что на вашем php.ini включено allow_url_fopen.

0 голосов
/ 20 июля 2010

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

Проверьте, включен ли 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...