使用php判断网页是否gzip压缩

网络编程 2025-03-28 18:09www.168986.cn编程入门

昨晚,群里的朋友们在讨论一个有趣的话题:当使用PHP的file_get_contents函数获取网页内容时,有时会遭遇乱码问题。特别是在响应头中显示Content-Encoding:gzip的情况下,浏览器可以正常显示内容,但在PHP中获取到的却是压缩后的页面内容。面对这一问题,我曾经有相似的经历,因此迅速意识到这是因为网站启用了gzip压缩。

对于这个问题,一个可能的解决方案是通过读取网页文件的前两个字节来判断其是否经过gzip压缩。这是一种常见的方法,通过读取文件头部信息来判断文件类型。对于gzip压缩的网页(通常是gbk编码),前两个字节应该是1F 8B(在十进制中是31 139)。下面是一段示例代码:

我们来看一个例子。假设我们要获取一个名为米尔军事网的网页内容,而这个网站启用了gzip压缩。直接使用file_get_contents获取的内容会是乱码。我们可以先判断网页是否经过gzip压缩,然后根据结果选择正确的获取方式。

我们首先打开与指定URL相关联的文件,只读前两个字节。如果这两个字节是31 139(即1F 8B的十六进制表示),那么就说明网页经过了gzip压缩。接下来,我们使用一个三元表达式来决定是使用原始的URL还是经过zlib处理的URL来获取网页内容。

代码如下所示:

```php

header('Content-Type:text/html;charset=utf-8');

$url = ' // 这里应该是米尔军事网的真实URL

$file = fopen($url, "rb"); // 以二进制只读模式打开文件

$bin = fread($file, 2); // 读取前两个字节

fclose($file);

$strInfo = @unpack("C2chars", $bin); // 解包字节数据

$typeCode = intval($strInfo['chars1'].$strInfo['chars2']); // 获取字节的十进制值

$isGzip = 0; // 初始化为未启用gzip

switch ($typeCode) {

case 31139: // 如果前两个字节是31 139(即gzip压缩标识)

$isGzip = 1; // 设置为启用了gzip压缩

break;

default:

$isGzip = 0; // 其他情况则未启用gzip压缩

}

$url = $isGzip ? "press.zlib://".$url : $url; // 根据是否启用gzip选择正确的URL获取方式

$mierHtml = file_get_contents($url); // 获取米尔军事网的数据

$mierHtml = iconv("gbk","utf-8",$mierHtml); // 将编码从gbk转换为utf-8

echo $mierHtml; // 输出内容

?>

```

这样,我们就可以根据网页是否启用gzip压缩来正确地获取网页内容,避免了乱码的问题。我们还进行了编码转换,确保内容在输出时的编码格式正确。这个例子中的代码简洁明了,同时保持了PHP的风格特点。

上一篇:PHP标准库 (SPL)——Countable用法示例 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by