【发布时间】: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 外,所有功能都有效,因此这不是传入连接与传出连接的问题。有关实际问题的详细信息,请参阅我的回答。