CURL和HTTPS,“无法解析主机”

时间:2009-08-27 14:57:12

标签: php curl

我正在尝试使用CURL获取页面的内容。正在进行提取的页面是https,它尝试提取的页面也是https。我在尝试所有设置时收到错误“无法解析主机”。

$c=curl_init();
curl_setopt($c, CURLOPT_URL,$url);
//curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x");
curl_setopt ($c, CURLOPT_RETURNTRANSFER, TRUE);
//curl_setopt($c, CURLOPT_SSL_VERIFYPEER, TRUE);
//curl_setopt($c, CURLOPT_SSL_VERIFYHOST, TRUE);
curl_setopt($c, CURLOPT_HEADER, FALSE);

$html=curl_exec($c);

if($html === false) {
    echo curl_error($c);
}
else {
    echo 'Operation completed without any errors';
}   


curl_close($c);

有什么想法吗?

11 个答案:

答案 0 :(得分:50)

我发现CURL可以决定使用IPv6,在这种情况下,它会尝试解析但不会得到IPv6答案(或者那种效果)并超时。

您可以尝试命令行开关-4来测试它。

在PHP中,您可以通过设置此行来配置此行:

curl_setopt($_h, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

答案 1 :(得分:27)

我遇到了同样的问题。 Coudn没有解决google.com问题。 php fpm中有一个错误,我正在使用它。重新启动php-fpm解决了它。

答案 2 :(得分:25)

可能是DNS问题?

针对this code尝试您的网址:

$_h = curl_init();
curl_setopt($_h, CURLOPT_HEADER, 1);
curl_setopt($_h, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($_h, CURLOPT_HTTPGET, 1);
curl_setopt($_h, CURLOPT_URL, 'YOUR_URL' );
curl_setopt($_h, CURLOPT_DNS_USE_GLOBAL_CACHE, false );
curl_setopt($_h, CURLOPT_DNS_CACHE_TIMEOUT, 2 );

var_dump(curl_exec($_h));
var_dump(curl_getinfo($_h));
var_dump(curl_error($_h)); 

答案 3 :(得分:5)

只是一个可能有用的注释 - 我在我的笔记本电脑上遇到了这个问题(在启动后通过wifi连接),并重新启动服务器(连接后)修复了问题。我想在我的情况下,这可能与apache离线启动有关,也许注意到DNS查找失败了?

答案 4 :(得分:2)

Ubuntu上的glibc中存在一个当前错误,可能会产生这种影响: https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1674733

要解决此问题,请更新libc和所有相关的(要升级的软件包:libc-bin libc-dev-bin libc6 libc6-dev libfreetype6 libfreetype6-dev locales multiarch-support)并重新启动服务器。

答案 5 :(得分:0)

  

经过以上所有尝试,仍然无法解决我的问题。   但是针对我的问题有了新的解决方案。

在要发出请求的服务器上,应该有一个虚拟主机条目。

sudo vim /etc/hosts

并插入

  

192.xxx.x.xx www.domain.com

如果您要从服务器向自身发出请求,则是为了解决您的虚拟主机或对其进行标识,服务器需要上面的东西,否则服务器将无法理解您的请求(原始)主机。

答案 6 :(得分:-1)

我们需要将主机安全证书添加到php.ini文件中。对于本地开发环境,我们可以在您的本地php.ini中添加cacert.pem

做phpinfo();并将你的php.ini路径打开并添加uncomment; curl.capath

curl.capath = path_of_your_cacert.pem

答案 7 :(得分:-1)

添加你的本地主体 恩。 127.0.0.1 cards.localhost 在/ etc / hosts目录中。 现在重启apache服务器

答案 8 :(得分:-1)

如果您在Windows XAMPP / WAMP上执行此操作,则可能无法正常运行。

我解决了设置Laravel Homestead / Vagrant解决方案以创建我的(Ubuntu)开发环境的问题-它具有内置功能:Nginx,PHP 5.6,PHP 7.3,PHP 7.2,PHP 7.1,MySQL,PostgreSQL,Redis,Memcached ,节点...等等。

有关如何设置环境的信息,请参见here-确实值得付出努力!

  

Laravel Homestead是一个预先包装的官方Vagrant盒子,它为您提供了一个绝佳的开发环境,而无需在本地计算机上安装PHP,Web服务器和任何其他服务器软件。无需担心搞砸操作系统!无业游民的箱子是完全一次性的。如果出现问题,您可以在几分钟内销毁并重新创建盒子!

然后,您可以在几秒钟内轻松切换PHP版本或设置更多虚拟主机,新数据库。

答案 9 :(得分:-2)

您收到错误是因为您可能在本地服务器环境中执行此错误。在进行cURL调用时,您需要跳过证书检查。为此,只需添加以下选项

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST,  0);

答案 10 :(得分:-3)

您可能必须启用HTTPS部分:

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST,  2);

如果您需要验证(自己验证身份),您可能也需要这样做:

curl_setopt($c, CURLOPT_USERPWD, 'username:password');