为何Transfer-Encoding请求头未被PHP服务端正确解析?
问题原因
导致该问题的核心原因有两个:
请求头冲突,分块编码配置未生效
你使用--data参数提交数据时,curl会自动计算请求体长度并添加Content-Length请求头,此时你手动添加的Transfer-Encoding: chunked请求头和Content-Length同时存在。
按照HTTP/1.1规范,当请求同时携带Content-Length和Transfer-Encoding头时,服务器必须优先处理Content-Length,忽略Transfer-Encoding配置。所以服务器不会按分块编码规则解析你的请求体,而是直接按Content-Length读取固定长度的内容,最终PHP无法正确解析出user参数,$_POST["user"]为空。
Shell转义问题导致请求体格式错误
你在--data参数值中写的\r\n在普通双引号包裹下,不会被Shell解析为实际的回车换行符,只会作为字面量字符传输。你的请求体实际内容是包含字面\r\n的字符串,完全不符合分块编码的格式要求,就算服务器按分块规则解析也无法识别出正确的参数内容。
正确的测试写法
如果要测试分块编码的POST请求,可以让curl自动处理分块逻辑,不需要手动构造分块内容:
curl --data "user=mehran" -H "Transfer-Encoding: chunked" "http://172.16.17.10/pg3.php"
这种写法curl会自动处理分块编码逻辑,不会额外添加Content-Length头,服务器可以正常解析参数,响应中会输出mehran。
内容的提问来源于stack exchange,提问作者mehran_2020
相关产品推荐
相关产品推荐

