Php Curl不仅适用于一个网站



我有一个非常非常奇怪的错误。 我需要访问这个网站:http://sub.example.com/使用cURL。从本地主机我没有问题,如果我从命令行或浏览器使用 cURL 访问网站。

我在我的站点服务器上使用以下代码:

<?php 

$url="http://sub.example.com/";
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);
var_dump($result);

?>

我得到$result=假

如果我使用尝试/捕获,我得到:curl 失败,出现错误 #6:无法解析主机

我还尝试用另一个网站的网址替换$url,它总是有效(http 和 https,域和子域,在我的服务器和外部(!

我已经花了一天的时间试图解决这个问题,请帮助我!

提前谢谢你,卢卡

根据googleDNS,sub.example.com不存在。

$ nslookup sub.example.com 8.8.8.8
*** google-public-dns-a.google.com can't find sub.example.com: Non-existent domain
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

它在本地主机上为您工作的事实意味着您有一个奇怪的 DNS,或者可能是您的主机文件中的条目,而您的 Siteground 服务器则没有。

无论如何,Curl failed with error #6: Could not resolve host意味着服务器的DNS找不到sub.example.com,但幸运的是,如果您知道要连接到哪个IP,则可以完全绕过DNS,方法是编写:

curl_setopt($ch, CURLOPT_URL,'http://93.184.216.34/');
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Host: sub.example.com'));

(还有一个更正确的 curlopt 来告诉 curl 哪个 IP 与 wich 域一起使用,但这个名字目前让我逃脱了,IIRC、PHP 还没有添加对它的官方支持,所以你必须使用它的魔术值,而不是定义的名称,但手动设置Host:标头无论如何都很容易(