【问题标题】:PHP CURL to get contents of a https pagePHP CURL 获取 https 页面的内容
【发布时间】:2012-09-10 21:19:45
【问题描述】:

示例网址: https://www.tescogoldexchange.com/gold-calculator.aspx?carat=9&weight=1&ref=miniQuote

我正在尝试使用 cURL 来获取 HTTPS 页面的内容。

问题是我无法抓取文档,我不知道为什么。

    function download_page($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)");

    return curl_exec($ch);
}

【问题讨论】:

    标签: php curl https


    【解决方案1】:

    您很可能遇到this guy 遇到的相同问题。而且,他似乎已经修复了它。问题可能是关于 SSL 证书的协商以及 cURL 应该如何告诉服务器正在发送的证书是可以信任的。

    【讨论】:

      【解决方案2】:

      检查错误:

      $result = curl_exec($ch);
      if (!$result) {
         die(curl_error($ch));
      }
      

      您很可能被 curl 不再附带“有效” CA 的内部列表这一事实所困扰,因此无法验证远程站点的证书是否有效。您必须禁用证书验证,和/或自己安装 CA 列表

      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      

      附言永远不要假设对远程资源的操作成功 - 始终检查错误情况,并输出任何可用的错误消息。开灯,而不是在黑暗中四处乱撞,您可以省去很多麻烦。

      【讨论】:

        【解决方案3】:

        您提供的代码实际上对我来说可以正常工作,无需修改。正如 RolfVandeKrol 所提到的,您可能遇到了 SSL 协商问题。要尝试解决这个问题,您可以关闭 SSL 对等验证:

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        

        要查看实际情况,在修改之前,您可以使用curl_getinfo($ch) 查看所有返回的标头。这应该让您知道您的脚本正在收到什么样的响应以进行正确诊断。

        此外,您可能希望修改您的函数以使用curl_close($ch); 正确关闭curl 句柄。尝试,而不是 return curl_exec($ch);,使用:

            ...
            $contents = curl_exec($ch);
            curl_close($ch);
            return $contents;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-26
          • 2020-04-07
          • 2010-12-31
          • 2011-02-11
          • 1970-01-01
          • 1970-01-01
          • 2011-08-23
          • 1970-01-01
          相关资源
          最近更新 更多