PHP cURL:无法解析主机(通过 VPN)

the*_*d47 2 php dns macos vpn curl

我远程工作,可以通过 VPN 访问内部服务器。当我的 VPN 连接建立后,我可以通过curl 访问我的网络服务器:

curl http://sub.mydomain.com
Run Code Online (Sandbox Code Playgroud)

我还可以通过浏览器访问网络服务器http://sub.mydomain.com。所以这似乎不是网络服务器本身的 DNS 问题。

然而,当开发通过 Apache 在本地提供服务的 Laravel 4.2 应用程序 (PHP 5.6) 时,phpcurl_exec无法解析主机。奇怪的是,phpgethostbyname($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);
Run Code Online (Sandbox Code Playgroud)

这让我不知所措。我不明白 PHPcurl 如何处理 DNS 解析(显然不是gethostbyname)。我一开始也不明白专用网络上的 DNS 查找是如何工作的。所以我真的不知道在哪里可以找到 PHP curl 来解析我的私有主机。

the*_*d47 5

命令行curl解析主机。浏览器解析了主机。仅PHPcurl未能解决。

最终,问题归结为curl 配置。我使用自制程序安装了 PHP,并将其作为依赖项安装curl-openssl以供 PHP 使用。此curl 安装由brew 公式配置以用于c-ares域名解析。我不知道如何c-ares工作,但这个 VPN DNS 显然是一个边缘情况,它在 OS X 上无法正确处理(可能是因为 OS X 在保持最新状态方面做得很糟糕/etc/resolv.conf)。

/usr/bin/curl另一方面被配置为使用本机 OS X 解析器。这与 PHPgethostbyname和 Web 浏览器使用的解析器相同,这解释了为什么它们都能按预期工作。

$ brew uninstall --ignore-dependencies curl-openssl
Run Code Online (Sandbox Code Playgroud)

这通过转储这个“损坏的”curl 安装解决了我的问题。我不确定回退机制是如何工作的,但我相信 PHP 现在正在使用,/usr/bin/curl因为我没有其他安装curl(据我所知),并且现在curl列出的版本与之前不匹配的版本相匹配。phpinfo()/usr/bin/curl