我远程工作,可以通过 VPN 访问内部服务器。当我的 VPN 连接建立后,我可以通过curl 访问我的网络服务器:
curl http://sub.mydomain.com
我还可以通过访问 http://sub.mydomain.com
在浏览器中访问网络服务器。所以这似乎不是网络服务器本身的 DNS 问题。
但是,在开发通过 Apache 本地服务的 Laravel 4.2 应用程序 (PHP 5.6) 时,php 的 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 来解析我的私有(private)主机。
最佳答案
命令行curl
解析主机。浏览器解析了主机。仅PHPcurl未能解决。
最终,问题归结为curl 配置。我使用自制程序安装了 PHP,并作为依赖项安装了 PHP 使用的 curl-openssl
。此安装的curl由brew公式配置为使用c-ares
进行域名解析。我不知道 c-ares
是如何工作的,但是这个 VPN DNS 显然是一个边缘情况,它在 OS X 上无法正确处理(可能是因为 OS X 在保持 /etc/resolv.conf
是最新的)。
/usr/bin/curl
被配置为使用 native OS X 解析器。这与 PHP 的 gethostbyname
和 Web 浏览器使用的解析器相同,这解释了为什么它们都能按预期工作。
$ brew uninstall --ignore-dependencies curl-openssl
这通过转储这个“损坏的”curl 安装解决了我的问题。我不确定回退机制是如何工作的,但我相信 PHP 现在正在使用 /usr/bin/curl
因为我没有安装其他 curl
(我知道),phpinfo()
中列出的 curl
版本现在与 /usr/bin/curl
匹配,而之前则不匹配。
关于PHP curl : could not resolve host (over VPN),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59745506/