PHP CURL & HTTPS
我发现这个函数做得很棒(恕我直言): http://nadeausoftware.com/articles/ 2007/06/php_tip_how_get_web_page_using_curl
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
我唯一的问题是它不适用于 https://。有什么想法我需要做什么才能使其适用于 https 吗?谢谢!
I found this function that does an AWESOME job (IMHO): http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curl
/**
* Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an
* array containing the HTTP server response header fields and content.
*/
function get_web_page( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
The only problem I have is that it doesn't work for https://. Anny ideas what I need to do to make this work for https? Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我试图使用 CURL 与 php 进行一些 https API 调用,但遇到了这个问题。我注意到 php 网站上的一个建议让我启动并运行: http://php.net /manual/en/function.curl-setopt.php#110457
I was trying to use CURL to do some https API calls with php and ran into this problem. I noticed a recommendation on the php site which got me up and running: http://php.net/manual/en/function.curl-setopt.php#110457
像 Gavin Palmer 答案一样的另一个选项是使用
.pem
文件,但带有curl选项从 https://curl.haxx.se/docs/caextract.html 并将其保存在服务器上的某个位置(在public 文件夹)
在代码中而不是
php.ini 中设置该选项
文件。在你的代码中
注意:像@Gavin Palmer那样在
php.ini
中设置cainfo比像我一样在你的代码中设置它要好,因为它每次都会节省磁盘IO函数被调用时,我只是这样做,以防您想动态测试 cainfo 文件,而不是在测试函数时更改php.ini
。Another option like Gavin Palmer answer is to use the
.pem
file but with a curl optiondownload the last updated
.pem
file from https://curl.haxx.se/docs/caextract.html and save it somewhere on your server(outside the public folder)set the option in your code instead of the
php.ini
file.In your code
NOTE: setting the cainfo in the
php.ini
like @Gavin Palmer did is better than setting it in your code like I did, because it will save a disk IO every time the function is called, I just make it like this in case you want to test the cainfo file on the fly instead of changing thephp.ini
while testing your function.需要注意的是,上述解决方案在本地主机上不起作用,您必须将代码上传到服务器,然后它才能工作。我没有收到任何错误,而不是错误的请求,问题是我使用的是本地主机(test.dev,myproject.git)。上述两种解决方案都有效,推荐使用 SSL 证书的解决方案。
转到https://curl.haxx.se/docs/caextract.html、下载最新的cacert.pem。存储在某个地方(不在公共文件夹中 - 但无论如何都会工作)
使用此代码
One important note, the solution mentioned above will not work on local host, you have to upload your code to server and then it will work. I was getting no error, than bad request, the problem was I was using localhost (test.dev,myproject.git). Both solution above work, the solution that uses SSL cert is recommended.
Go to https://curl.haxx.se/docs/caextract.html, download the latest cacert.pem. Store is somewhere (not in public folder - but will work regardless)
Use this code
快速修复,将其添加到您的选项中:
在这种情况下,您不知道实际连接到哪个主机,因为 cURL 不会以任何方式验证证书。不建议这样做,并且会让您容易遭受 中间人攻击!
或者将其添加到您当前的函数中:
Quick fix, add this in your options:
In this situation you have no idea what host you're actually connecting to, because cURL will not verify the certificate in any way. This is not recommended and will leave you open to man-in-the-middle attacks!
Or just add it to your current function: