PHP curl : could not resolve host (over VPN)

标签 php macos curl dns vpn

我远程工作,可以通过 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/

相关文章:

php - PHP 解析 SOAP 响应的问题

php - 使用 codeigniter 更新记录时出错

php - 将 html 表行合并为 mysql 和 php 数据透视表中的行

php - nl2br() 创建一个额外的新行

python - 我可以安全删除 "/anaconda3/pkgs"中的文件吗?

macos - cocoa 图像选择器弹出框

android - 在 Mac Pro 上进行 Windows 开发

windows - 在 Windows 命令行中使用 Chrome 中的 'Copy as cURL'

curl - 将 curl 转换为 coldfusion cfhttp

php - 在 Windows 上安装 codeigniter sparks 管理器