Я пытаюсь подключиться к своему сайту, используя функцию 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
).
Ваши варианты:
Сделайте свой провайдер правильной маршрутизацией для своих внешних IP-адресов в своем брандмауэре. Это выполнимо, но часто пропущено, так как это редко необходимо. Один из аргументов заключается в том, что вы не можете получить доступ к другим сайтам, которые находятся в том же сегменте сети, что и вы сегодня.
Сообщите своему провайдеру добавить http://www.domain.com -> 127.0.0.1
в файл hosts на вашем сервере
Используйте свой собственный код сокета, чтобы «подделать» заголовок хоста, все еще подключаясь к localhost. В PHP есть много примеров классов, и mvds уже дал вам пример.
Найдите другой способ получения информации. Это на том же сервере, не так ли? Получение его по 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;
Самый простой способ получить локальный файл – использовать локальный путь.
file_get_contents('/home/usr/public_html/path/page.html');
Путь имени файла изменится с одного сервера на другой, но вы должны получить эту идею.
На моем пути «/ usr /» является именем пользователя для учетной записи.
Если скрипт находится в том же каталоге страницы, вы можете использовать:
file_get_contents('page.html');