PHP cURL: не удалось разрешить хост (через VPN) - PullRequest
1 голос
/ 15 января 2020

Я работаю удаленно и могу получить доступ к внутренним серверам через VPN. Когда мое VPN-соединение установлено, я могу подключиться к своему веб-серверу с помощью curl:

curl http://sub.mydomain.com

Я также могу подключиться к веб-серверу в браузере, перейдя на http://sub.mydomain.com. Так что, похоже, это не проблема DNS с самим веб-сервером.

При разработке моего приложения Laravel 4.2 (PHP 5.6), обслуживаемого локально через Apache, однако, php 's curl_exec не удается разрешить хост. Как ни странно, php gethostbyname($hostname) правильно разрешает хост. Я пытался форсировать IPv4, так как читал, что IPv6 может привести к сбоям этого типа, но безуспешно.

// works
$ip = gethostbyname($hostname);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://$ip/path");
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_exec($ch);

// does NOT work
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://$hostname/path");
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_exec($ch);

Это оставляет меня в растерянности. Я не понимаю, как PHP curl обрабатывает разрешение DNS (явно не с gethostbyname). Я также не совсем понимаю, как в первую очередь работают DNS-запросы в частных сетях. Так что я действительно не знаю, где искать PHP curl для разрешения моих личных хостов.

1 Ответ

1 голос
/ 08 февраля 2020

Командная строка curl разрешен хост. Браузер разрешил хост. Не удалось разрешить только PHP curl.

В конечном счете, проблема сводилась к конфигурации curl. Я установил PHP с помощью homebrew и, в качестве зависимости, установил curl-openssl для использования PHP. Эта установка curl настраивается формулой brew для использования c-ares для разрешения доменного имени. Я не знаю, как работает c-ares, но этот DNS DNS, по-видимому, является крайним случаем, который он не обрабатывает правильно в OS X (возможно, из-за того, что OS X делает паршивую работу по поддержанию /etc/resolv.conf в актуальном состоянии).

/usr/bin/curl, с другой стороны, был настроен на использование собственного распознавателя OS X. Это тот же распознаватель, который используется PHP gethostbyname и веб-браузером, что объясняет, почему оба из них работают должным образом.

$ brew uninstall --ignore-dependencies curl-openssl

Это решило мою проблему, сбросив этот «сломанный» локон установка. Я не уверен, как работает механизм отката, но я считаю, что PHP теперь использует /usr/bin/curl, поскольку у меня нет других установок curl (о которых я знаю) и версии curl, перечисленных в phpinfo() сейчас соответствует /usr/bin/curl, если раньше этого не было.

...