PHP - 检测gzip服务器响应

时间:2011-10-12 14:15:25

标签: php curl http-headers gzip

我正在使用curl来获取网页,我需要检测响应是否为gzip。

如果在响应头中指定了Content-Encoding,则此工作完全正常,但某些服务器返回“Transfer-Encoding”:“Chunked”且没有Content-Encoding标头。

有没有办法检测gzip或获取原始(编码)服务器响应?

我尝试查看curl_getinfo,但未指定content_encoding。

感谢。

3 个答案:

答案 0 :(得分:2)

您可以检查响应是否以gzip幻数开头,具体为1f 8b

答案 1 :(得分:1)

  

有没有办法检测gzip

是。您可以使用cURLs标头功能。例如,您可以定义一个处理标题响应的函数。将curl_setopt()CURLOPT_HEADERFUNCTION选项一起使用。或者使用fopen()选项将其写入文件(使用CURLOPT_WRITEHEADER创建的文件)。

您可以使用更多选项。在curl_setopt()手册中查看可能性。您要查找的标题名称为: Content-Encoding

如果您在文件中输出了输出,那么您也可以将PHP finfo与其predefined constants一起使用。或mime_content_type()已弃用!),如果您无法使用finfo。

  

[...]或获取原始(编码)服务器响应?

是。您可以指定accept-encoding标头。您要查找的值是 identity 。 所以你可以发送:

Accept-Encoding: identity

可以关注HTTP/1.1 RFC 获取未编码/未压缩的输出(例如直接将其写入文件)。 为此目的使用CURLOPT_ENCODING。您也可以使用* curl_setopt *。

进行设置

答案 2 :(得分:1)

您可以发出单独的HEAD请求:

CURLOPT_HEADER => true
CURLOPT_NOBODY => true

或者请求标题作为原始请求的前缀:

CURLOPT_HEADER => true

但是,如果您只想获取(已解码的)HTML,则可以使用:

CURLOPT_ENCODING => ''

CURL会自动与服务器协商并为您解码。