2017-03-09 22 views
1

我'使用curl来检查是否有任何给定的网站是gzip启用或不。 我正在使用下面的代码来检查这一点。如何检查网站是否启用gzip?

$ch = curl_init('website name'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Encoding: gzip, deflate', 
    'Accept-Language: en-US,en;q=0.5', 
    'Connection: keep-alive', 
    'SomeBull: BeingIgnored', 
    'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0' 
) 
); 
$response = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 

print_r($info); 

每次结果都显示结果中包含gzip选项。甚至那些gzip没有启用的网站,比如http://pramitscomicsdump.com,所以你能告诉我我做错了什么。我只需要检查gzip是否启用或不使用卷曲。

我学会了使用这个命令来检查

curl -I -H 'Accept-Encoding: gzip,deflate' 'site name' 

,但我无法在PHP运行此命令。

+0

我运行此命令$水库=了shell_exec(“卷曲-I -H“接受编码:gzip,紧缩的http:// WW .google.com“); print_r($ res);但空的结果 – learner

回答

1

与您的代码很好的努力。

有此检查时要考虑几件事情:

  1. 仅仅因为你问的gzip,并不意味着你会得到它,所以你需要实际检查响应头看如果它是gzip压缩。 (注意:网站上的某些页面可能使用gzip,其他页面可能不会,但“主页”页面很有可能)。
  2. 如果您被重定向,您可能需要使用CURLOPT_FOLLOWLOCATION。如果您被重定向,cURL将返回多组标题,因此您需要检查最终请求中的标题。

下面是一些代码,让你开始:

<?php 

$ch = curl_init('http://example.com'); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // follow redirects 
curl_setopt($ch, CURLOPT_HEADER, 1); // include headers in curl response 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Encoding: gzip, deflate', // request gzip 
    'Accept-Language: en-US,en;q=0.5', 
    'Connection: keep-alive', 
    'SomeBull: BeingIgnored', 
    'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0' 
) 
); 
$response = curl_exec($ch); 

if ($response === false) { 
    die('Error fetching page: ' . curl_error($ch)); 
} 

$info = curl_getinfo($ch); 

for ($i = 0; $i <= $info['redirect_count']; ++$i) { 
    // split request and headers into separate vars for as many times 
    // as there were redirects 
    list($headers, $response) = explode("\r\n\r\n", $response, 2); 
} 

curl_close($ch); 

$headers = explode("\r\n", $headers); // split headers into one per line 
$hasGzip = false; 

foreach($headers as $header) { // loop over each header 
    if (stripos($header, 'Content-Encoding') !== false) { // look for a Content-Encoding header 
     if (strpos($header, 'gzip') !== false) { // see if it contains gzip 
      $hasGzip = true; 
     } 
    } 
} 

var_dump($hasGzip); 
+0

我用google.com,并得到这个错误“错误提取页面:SSL证书问题:无法获得本地发行机构证书” – learner

+0

@learner这是一个完整的其他问题(您的系统已经过时CA证书)。对于测试,你可以通过添加'curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,0)来解决它。 curl_setopt($ ch,CURLOPT_SSL_VERIFYHOST,0);'代码,但这是坏的!相反,更新您的CA证书(关于SO的这个确切的错误的答案很多)。 – drew010

+0

它不适用于这些网站,plagiarismcheckerx.com,leoexperts.com(我收到消息虚假结果),而你可以在这里看到这些是gzipped https://checkgzipcompression.com/?url=http%3A%2F% 2Fplagiarismcheckerx.com – learner