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