我在尝试从网址抓取内容时遇到了一些棘手的问题。
问题是URL返回没有响应和http"请求标头"大小为0。
我之前在同一个网站上遇到过类似的问题并且已经解决了(在StackOverflow上有一些帮助)。
以前,问题是由于他们的SSL证书配置错误,解决方案是将CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER都设置为false。但是,这次似乎即使将这两个cURL参数设置为false,cURL仍然无法从URL中获取。
其他说明:
i。)即使使用隐身模式,也可以使用常规网络浏览器获取网页内容。
ii。)我在下面设置的CURLOPT_HTTPHEADER是Web浏览器发送的确切标题。无论我是否设置此参数,cURL都不会返回任何内容("请求标头"仍为零)。
我后来在使用Ubuntu 14.04的LEMP服务器上测试了代码(仅使用网络主机提供的股票服务器映像)并且代码正常工作。所以这似乎是服务器问题,而不是代码问题。
以下是配置:
使用PHP 5.3.3的CentOS 6 LEMP服务器(不起作用):
curl:
curl 7.19.7
SSL Version NSS/3.14.0.0
openssl:
OpenSSL Library Version OpenSSL 1.0.0-fips 29 Mar 2010
使用PHP 5.4.40的CentOS 5 LAMP服务器(不起作用。此配置来自共享网络托管服务提供商的服务器设置。我无法控制它。):
curl:
curl 7.38.0
SSL Version OpenSSL/0.9.8b
openssl:
OpenSSL Library Version OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
Ubuntu 14.04 LEMP服务器,带有PHP 5.5.9(可以工作。这是来自VPS网站主机提供的股票服务器映像):
curl:
curl 7.35.0
SSL Version OpenSSL/1.0.1f
openssl:
OpenSSL 1.0.1f 6 Jan 2014
由于我需要在共享托管环境中使用此代码,我想知道是否有人可以告诉我导致差异的原因,以便我可以进行更改或请求更改(如果可能)。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0");
curl_setopt($ch, CURLOPT_HTTPHEADER,
array(
'Host: www.example.com',
'User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0',
'Accept: application/json, text/javascript, */*; q=0.01',
'Accept-Language: en-US,en;q=0.5',
'DNT: 1',
'X-Requested-With: XMLHttpRequest',
'Referer: https://www.example.com/path/to/example.html',
'Connection: keep-alive',
));
$url = 'https://www.example.com/api/v1/example';
curl_setopt($ch, CURLOPT_URL, $url);
$output = curl_exec($ch);
print_r( curl_getinfo($ch) );
?>
答案 0 :(得分:3)
总结一下。它不适用于SSL版本NSS / 3.14.0.0和OpenSSL / 0.9.8b,但适用于OpenSSL / 1.0.1f。
查看SSLLabs report可以看出主机至少需要TLS 1.1,即不支持TLS 1.0甚至更低。对版本1.0.1的OpenSSL添加了对TLS 1.1的支持,即OpenSSL 0.9.8b不支持。 NSS 3.14.0支持包含TLS 1.1(仅在3.14版本中添加)但从RHEL6 / CentOS6的this bug curl可以看出,默认情况下仅使用TLS 1.0。