我正在使用curl来获取网页,我需要检测响应是否为gzip。
如果在响应头中指定了Content-Encoding,则此工作完全正常,但某些服务器返回“Transfer-Encoding”:“Chunked”且没有Content-Encoding标头。
有没有办法检测gzip或获取原始(编码)服务器响应?
我尝试查看curl_getinfo,但未指定content_encoding。
感谢。
答案 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会自动与服务器协商并为您解码。