CURL и HTTPS, «Не удается разрешить хост» - PullRequest
35 голосов
/ 27 августа 2009

Я пытаюсь получить содержимое страницы, используя CURL. Страница, которая выполняет выборку, является https, а страница, которую он пытается извлечь, также является https Я получаю сообщение об ошибке «Не удалось разрешить хост» со всеми настройками, которые я пробую.

$c=curl_init();
curl_setopt($c, CURLOPT_URL,$url);
//curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x");
curl_setopt ($c, CURLOPT_RETURNTRANSFER, TRUE);
//curl_setopt($c, CURLOPT_SSL_VERIFYPEER, TRUE);
//curl_setopt($c, CURLOPT_SSL_VERIFYHOST, TRUE);
curl_setopt($c, CURLOPT_HEADER, FALSE);

$html=curl_exec($c);

if($html === false) {
    echo curl_error($c);
}
else {
    echo 'Operation completed without any errors';
}   


curl_close($c);

Есть идеи?

Ответы [ 11 ]

50 голосов
/ 26 апреля 2013

Я обнаружил, что CURL может решить использовать IPv6, и в этом случае он пытается разрешить, но не получает ответ по IPv6 (или что-то в этом роде), и время ожидания истекло.

Вы можете попробовать ключ командной строки -4, чтобы проверить это.

В PHP вы можете настроить эту строку, установив следующее:

curl_setopt($_h, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
27 голосов
/ 12 августа 2015

У меня была такая же проблема. Не удалось разрешить google.com. Где-то в php fpm была ошибка, которую я использую. Перезапуск php-fpm решил это за меня.

25 голосов
/ 27 августа 2009

Может проблема с DNS?

Попробуйте свой URL против этого кода :

$_h = curl_init();
curl_setopt($_h, CURLOPT_HEADER, 1);
curl_setopt($_h, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($_h, CURLOPT_HTTPGET, 1);
curl_setopt($_h, CURLOPT_URL, 'YOUR_URL' );
curl_setopt($_h, CURLOPT_DNS_USE_GLOBAL_CACHE, false );
curl_setopt($_h, CURLOPT_DNS_CACHE_TIMEOUT, 2 );

var_dump(curl_exec($_h));
var_dump(curl_getinfo($_h));
var_dump(curl_error($_h)); 
5 голосов
/ 24 ноября 2010

Просто примечание, которое может быть полезным - у меня была эта проблема с Apache на моем ноутбуке (который подключается через wifi после запуска), и перезапуск сервера (после подключения) устранил проблему. Я полагаю, что в моем случае это может быть связано с запуском apache в автономном режиме, и, возможно, там отмечается сбой поиска DNS?

2 голосов
/ 22 марта 2017

В Ubuntu есть текущая ошибка в glibc, которая может иметь такой эффект: https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1674733

Чтобы решить эту проблему, обновите libc и все связанные с ним (пакеты, которые будут обновлены: libc-bin libc-dev-bin libc6 libc6-dev libfreetype6 libfreetype6-dev locales multiarch-support) и перезапустите сервер.

0 голосов
/ 13 июня 2019

После того, как попробовал все выше, я до сих пор не могу решить мою проблему. Но получил новое решение для моей проблемы.

На сервере, где вы собираетесь сделать запрос, должна быть запись вашего виртуального хоста.

sudo vim /etc/hosts

и вставить

192.xxx.x.xx www.domain.com

Причина, по которой вы делаете запрос от сервера к самому себе, чтобы разрешить ваш виртуальный хост или идентифицировать его, серверу потребовалось бы больше всего, иначе сервер не поймет ваш запрашивающий (исходный) хост.

0 голосов
/ 18 января 2019

Если вы сделаете это на Windows XAMPP / WAMP, то это, вероятно, не будет работать, как в моем случае.

Я решил проблему с настройкой решения Laravel Homestead / Vagrant для создания своей среды разработки (Ubuntu) - в нее встроены: Nginx, PHP 5.6, PHP 7.3, PHP 7.2, PHP 7.1, MySQL, PostgreSQL, Redis, Memcached , Узел ... и это лишь некоторые из них.

См. здесь для получения информации о том, как настроить среду - это действительно стоит усилий!

Laravel Homestead - это официальный, предварительно упакованный пакет Vagrant, который предоставляет вам прекрасную среду разработки, не требуя установки PHP, веб-сервера и любого другого серверного программного обеспечения на вашем локальном компьютере. Больше не нужно беспокоиться о том, чтобы испортить вашу операционную систему! Бродячие коробки полностью одноразовые. Если что-то пойдет не так, вы можете уничтожить и заново создать коробку за считанные минуты!

Тогда вы можете легко переключать версии PHP или создавать новые виртуальные хосты, новые базы данных всего за несколько секунд.

0 голосов
/ 22 ноября 2017

добавить свой локальный хост
ех. 127.0.0.1 cards.localhost в каталоге / etc / hosts. Теперь перезапустите сервер Apache

0 голосов
/ 30 августа 2016

Нам нужно добавить сертификат безопасности хоста в файл php.ini. Для локальной среды разработки мы можем добавить cacert.pem в ваш локальный php.ini.

do phpinfo (); и откройте путь к php.ini и добавьте комментарий; curl.capath

curl.capath = path_of_your_cacert.pem

0 голосов
/ 06 января 2016

Вы получаете сообщение об ошибке, потому что вы, вероятно, делаете это в своей среде локального сервера. Вам нужно пропустить проверку сертификатов при выполнении вызова cURL. Для этого просто добавьте следующие параметры

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST,  0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...