PHP - 检测 gzip 服务器响应

发布于 2024-12-09 14:20:18 字数 244 浏览 0 评论 0原文

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

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

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

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

谢谢。

I'm using curl to fetch a webpage, I need to detect if the response is gzip or not.

This works perfectly fine if Content-Encoding is specified in the response headers, but some servers instead return "Transfer-Encoding": "Chunked" and no Content-Encoding header.

Is there any way to detect gzip or get the raw (encoded) server response?

I tried looking at curl_getinfo but the content_encoding isn't specified either.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花开浅夏 2024-12-16 14:20:18

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

You can check if response starts with gzip magic numbers, specifically 1f 8b.

黎夕旧梦 2024-12-16 14:20:18

有没有办法检测gzip

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

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

如果文件中有输出,您还可以使用 PHP finfo< /a> 及其一些预定义常量。或者 mime_content_type()已弃用! )如果您无法使用 finfo。

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

是的。您可以指定接受编码标头。您要寻找的值是身份
因此,您可以发送:

Accept-Encoding: identity

可能会查看 HTTP/1.1 RFC
获取未编码/未压缩的输出(例如直接将其写入文件)。
为此,请使用CURLOPT_ENCODING。您也可以使用curl_setopt 来设置它。

Is there any way to detect gzip

Yes. You can use cURLs Header functions. For example you can define an function, which handles the header responses. Use curl_setopt()with the CURLOPT_HEADERFUNCTION option. Or write it to an file (which you have created with fopen()) with the CURLOPT_WRITEHEADER option.

There may are more options you could use. Look out the possibilities at the curl_setopt() manual. The header you are looking for have the name: Content-Encoding.

If you have the output in a file, you could also use PHPs finfo with some of its predefined constants. Or mime_content_type() (DEPRECATED!) if finfo is not available to you.

[...] or get the raw (encoded) server response?

Yes. You can specify the accept-encoding header. The value you are look for is identity.
So you can send:

Accept-Encoding: identity

May have look to the HTTP/1.1 RFC
To get an unencoded/uncompressed output (for example to directly write it into a file).
Use CURLOPT_ENCODING for this purpose. You can set it also with curl_setopt.

陌伤浅笑 2024-12-16 14:20:18

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

CURLOPT_HEADER => true
CURLOPT_NOBODY => true

或请求将标头添加到原始请求的前缀:

CURLOPT_HEADER => true

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

CURLOPT_ENCODING => ''

CURL 将自动与服务器协商并对其进行解码为你。

You can either issue a separate HEAD request:

CURLOPT_HEADER => true
CURLOPT_NOBODY => true

Or request the header to be prefixed to your original request:

CURLOPT_HEADER => true

But, if you just want to get the (decoded) HTML, you can use:

CURLOPT_ENCODING => ''

And CURL will automatically negotiate with the server and decode it for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文