【问题标题】:PHP cURL: could not resolve host (over VPN)PHP cURL:无法解析主机(通过 VPN)
【发布时间】:2020-05-01 20:54:48
【问题描述】:

我远程工作,可以通过 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 来解析我的私人主机。

【问题讨论】:

  • > 所以这似乎不是网络服务器本身的 DNS 问题。您的网络服务器看到的 DNS 与您的客户端看到的 DNS 不同。进入数据中心的连接与离开数据中心的连接不同。 http://$ip/ 可能是与 http://$hostname/ 完全不同的网站(一个 IP 地址可以有多个虚拟主机,一个虚拟主机可以跨越多个 IP 地址)。当问题出在其他地方时,Curl 可以报告 DNS 问题。问题很混乱,缺乏相关细节。尝试从服务器上的命令行对其进行测试。
  • 我想我不是很清楚,但是浏览器测试、命令行 curl 和 PHP 代码都是在客户端机器上运行的。除 PHP curl 外,所有功能都有效,因此这不是传入连接与传出连接的问题。有关实际问题的详细信息,请参阅我的回答。

标签: php macos curl dns vpn


【解决方案1】:

命令行curl 解析了主机。浏览器解析主机。只有 PHP curl 无法解决。

最终,问题归结为 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 解析器。这与 PHP 的 gethostbyname 和 Web 浏览器使用的解析器相同,这解释了为什么它们都能按预期工作。

$ brew uninstall --ignore-dependencies curl-openssl

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

【讨论】:

  • 非常感谢!你只是拯救了我的一天!
  • 考虑到由于 covid-19 新近在家工作的人数(可能通过 VPN 连接),我希望这个答案能帮助更多!
猜你喜欢
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 2014-09-12
  • 2010-11-23
  • 2011-05-20
  • 2021-12-18
相关资源
最近更新 更多