php 7.4 处理 deflate 编码 post 请求需用 php://input 读取原始数据并以 gzinflate() 解压,因 deflate 无 gzip/zlib 头;须检查 content-encoding: deflate,禁用自动解析,解压失败应判空处理,并验证解压后长度防 zip 炸弹。

PHP 7.4 处理 Deflate 编码的 POST 请求,核心在于正确读取原始压缩数据并用 gzinflate() 解压——因为 Deflate 压缩体不带 GZIP 头,不能用 gzdecode() 或自动解压机制。
确认请求是否为 Deflate 编码
服务端需检查请求头中的 Content-Encoding: deflate。注意:部分客户端(如 Java 的 Deflater)默认启用 nowrap 模式,生成的是纯 Deflate 流(无 zlib 封装头),这正是 PHP 中 gzdeflate()/gzinflate() 所处理的格式。
- 用
getallheaders()或$_SERVER['HTTP_CONTENT_ENCODING']获取编码类型 - 若值为
deflate,则进入原始流读取+手动解压流程 - 不要依赖
$_POST—— 它对压缩体完全无效
读取原始 POST 数据
必须使用 php://input 流获取未经解析的原始字节,这是唯一可靠方式:
$raw = file_get_contents('php://input');- 确保未启用
enable_post_data_reading = Off(默认为 On) - 避免任何前置输出(包括 BOM、空格、echo),否则
php://input可能为空
用 gzinflate() 安全解压
对原始数据调用 gzinflate(),它专用于 RFC 1951 Deflate 格式(无头信息):
$data = @gzinflate($raw);- 加
@抑制警告,因损坏或非 Deflate 数据会触发 E_WARNING - 解压失败时返回
false,应做判空处理:if ($data === false) { /* 拒绝请求或记录错误 */ } - 若需兼容带 zlib 头的 Deflate(少见),可用
gzuncompress()尝试 fallback
后续解析(如 JSON)
解压后得到明文字符串,按实际格式进一步处理:
- 若为 JSON:
$json = json_decode($data, true); if (json_last_error() !== JSON_ERROR_NONE) { /* 处理解析失败 */ } - 若为表单 URL 编码:
parse_str($data, $parsed); - 建议验证解压后长度是否合理(防 ZIP 炸弹),例如限制原始解压结果 ≤ 10MB
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











