【问题标题】:PHP - Detect gzip server responsePHP - 检测 gzip 服务器响应
【发布时间】:2011-10-12 14:15:25
【问题描述】:

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

如果在响应标头中指定了 Content-Encoding,这将非常有效,但有些服务器会返回 "Transfer-Encoding": "Chunked" 并且没有 Content-Encoding 标头。

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

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

谢谢。

【问题讨论】:

    标签: php curl http-headers gzip


    【解决方案1】:

    您可以检查响应是否以 gzip 幻数开头,特别是 1f 8b。

    【讨论】:

      【解决方案2】:

      有什么方法可以检测gzip

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

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

      如果你在一个文件中有输出,你也可以使用 PHPs finfo 和它的一些 predefined constants。或者 mime_content_type()(已弃用!)如果您无法使用 finfo。

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

      是的。您可以指定接受编码标头。您要查找的值是 identity。 所以你可以发送:

      Accept-Encoding: identity
      

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

      【讨论】:

        【解决方案3】:

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

        CURLOPT_HEADER => true
        CURLOPT_NOBODY => true
        

        或请求将标头作为原始请求的前缀:

        CURLOPT_HEADER => true
        

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

        CURLOPT_ENCODING => ''
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 2011-05-16
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多