У меня есть PHP-скрипт, который использует cURL для доступа к файлу, также расположенному на моем сервере (установлена программа электронного маркетинга). Я написал быстрый скрипт для проверки моей установки cURL, и он не работает, когда указывает на файл на моем собственном сервере. Сценарий:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com/test.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
if($contents) {
echo $contents;
} else {
$err = curl_error($ch);
echo $err;
}
curl_close($ch);
Когда я запускаю этот код, он возвращает ошибку: не удалось подключиться к хосту
Если я изменю URL-адрес на http://www.google.com или любой другой сайт, все будет работать нормально. Кроме того, когда я пытаюсь открыть определенную страницу через cURL на другом сервере, она работает так, как должна. Предположения, которые я делаю из этих тестов, заключаются в том, что PHP cURL установлен и (вроде) работает, и что проблема не в странице, которую пытаются открыть.
Я подумал, что это может быть проблема с портом, поэтому я попытался указать порт с тем же результатом (не подключаясь к хосту). Я пробовал как curl_setopt, так и http://www.mysite.com:80/, чтобы указать порт, который, как я знаю, открыт.
Это заставляет меня поверить, что проблема связана с моей установкой apache, но я не эксперт по apache, и я весь день бился головой с Google, но безрезультатно. Любые идеи, что может вызвать такой конкретный сбой cURL?
Ответ 1 · Jim Rubenstein
Попробуйте открыть http://www.mysite.com/test.php в веб-браузере. Если работает, то проблема с cURL. Если это не так, проблема либо в вашей сети, либо в конфигурации apache.
Вы можете проверить конфигурацию Apache, убедившись, что он работает в вашей системе. Затем попробуйте telnet <apache server ip> 80 из командной строки. После подключения попробуйте сделать следующее:
GET /test.php HTTP/1.1
Host: www.mysite.com
<2 line breaks>
Если вы получите ответ от apache, то это похоже на проблему с сетью. Убедитесь, что mysite.com разрешается в IP-адрес вашего сервера Apache, и трафик порта 80 может попасть на ваш сервер. Это также может быть проблема с петлевой маршрутизацией вашего маршрутизатора, пытающегося сделать запрос на свой собственный IP-адрес (при условии, что ваш сервер apache находится за маршрутизируемым сетевым соединением, тем же соединением, на котором вы находитесь).
Ответ 2 · рейтинг 3 · Phil Birnie
Столкнулся с той же проблемой, когда мое доменное имя не разрешалось на сервере, что приводило к сбою CURL запросов к самому себе.
Моя проблема заключалась в том, что мой веб-сервер не мог разрешить сам себя из-за некоторых правил брандмауэра (перед веб-сервером стоит балансировщик нагрузки, который блокировал трафик с сервера).
Другими словами, запуск следующей команды на моем сервере
curl -I http://www.mywebserver.com привело к:
$ curl -I http://www.mywebserver.com
curl: (7) couldn't connect to host
Обновление файла /etc/hosts на сервере для сопоставления имени домена с локальным IP-адресом решило проблему, и fopen и curl из моих сценариев снова заработали.
Ответ 4 · simne7
Я столкнулся с этим и на удаленном веб-сервере. Запустив curl на этом компьютере, я не смог получить доступ к файлам, размещенным на сервере Apache на том же компьютере. Странно, я мог получить доступ к файлу с помощью
curl -O http://example.com/file1.txt
но
curl -0 http://sub.example.com/file1.txt
не сработало.
Я решил эту проблему, добавив отсутствующую DNS-запись на DNS-сервер, работающий на машине. Похоже, что nslookup и т. д. сначала посмотрите на локальный DNS-сервер, прежде чем спрашивать кого-то еще. И поскольку локальный DNS-сервер ответил "не могу найти", curl сдался.