我有以下代码可以在不使用SSL的测试区域中工作,但不能在生产系统上工作。调用本身在浏览器中工作,但是当通过cURL运行时,我得到500错误。
$region = "https://api.mysite.com/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/cacert.pem");
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_URL, $region . $api);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$resp = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
return $resp;
如果我没有输入CURL_OPT_FAILONERROR,那么我不会收到任何错误,只是一个空白的回复。我很确定这与通过https(因为这是我的测试区域和当前区域之间的唯一区别)这一事实有关,但我无法弄清楚如何使其工作。
答案 0 :(得分:1)
要确认第一个问题是否因ssl而导致,请查看以下
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
它可以用吗?
答案 1 :(得分:0)
根据您的描述,问题很可能与匹配证书有关。尝试:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
显然,这不是解决问题的“解决方案”,但它可以帮助您进行故障排除。
祝你好运!
答案 2 :(得分:0)
尝试类似
的内容<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
$data = array(
CURLOPT_CAINFO => "/Users/davidmann/Documents/facebook.pem",
CURLOPT_SSL_VERIFYHOST => 1,
CURLOPT_SSL_VERIFYPEER => true
);
echo var_dump(curl_get('https://www.facebook.com/', array('Refferer' => 'https://www.facebook.com/'), $data));
/**
* Send a GET requst using cURL
* @param string $url to request
* @param array $get values to send
* @param array $options for cURL
* @return string
* @author David from Code2Design.com
* @link http://au.php.net/manual/en/function.curl-exec.php#98628
*/
function curl_get($url, array $get = NULL, array $options = array())
{
$defaults = array(
CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : ''). http_build_query($get),
CURLOPT_HEADER => 1,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 4
);
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
if( ! $result = curl_exec($ch))
{
trigger_error(curl_error($ch));
}
curl_close($ch);
return $result;
}
然后从您正在访问的网站下载证书(打开Firefox,转到https://site.com,右键单击,查看页面信息,安全选项卡,证书,选择最顶层证书,导出为x.509然后使用更新CURLOPT_CAINFO
希望这有帮助, 戴夫
答案 3 :(得分:0)
尝试设置CURLOPT_REFERER和CURLOPT_USERAGENT。 我有同样的问题,这解决了它。