PHP和cURL:相同的代码,但无法获取现有服务器conf

时间:2016-04-22 15:49:38

标签: php linux ssl curl centos

我在尝试从网址抓取内容时遇到了一些棘手的问题。

问题是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) );

?>

1 个答案:

答案 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。