2

我正在尝试复制此命令的功能:

exec('curl -k -d "pameters=here" https://apiurlhere.com', $output);

使用 curl_exec():

$url =  'https://apiurlhere.com?parameters=here';
$ci = curl_init();
curl_setopt($ci, CURLOPT_POST, TRUE);
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ci, CURLOPT_URL, $url);
$response = curl_exec($ci);
curl_close ($ci);
print_r($response);

我一直在尝试在文档(http://php.net/manual/en/function.curl-setopt.php)中找到的不同选项,并认为它是 CURLOPT_SSL_VERIFYPEER,但它仍然失败(响应返回为空)。

我发布到的 URL 使用 SNI,当 SSL 证书返回的主机名与预期不同时,这会导致 cURL 失败。

是否有相当于 -k 的 curl_setopt?

4

2 回答 2

2

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE)相当于-k命令行(你不应该真正使用它,因为它使连接容易受到 MITM 攻击)。

您的问题是您假设这-d "pameters=here"相当于将这些参数放在 URL 查询中,如下所示https://apiurlhere.com?parameters=here

情况并非如此,请参阅以下文档-d

(HTTP) 将 POST 请求中的指定数据发送到 HTTP 服务器,就像浏览器在用户填写 HTML 表单并按下提交按钮时所做的一样。这将导致 curl 使用内容类型 application/x-www-form-urlencoded 将数据传递给服务器。

您可能应该POSTFIELDS为此使用:

curl_setopt($ch, CURLOPT_POSTFIELDS, array("parameters" => "here"));
于 2012-10-17T20:19:21.417 回答
2

试试看:

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 

http://www.php.net/manual/en/function.curl-setopt.php

于 2012-10-17T19:58:06.457 回答