PHP8.2调用Proxmox API出现501分块传输编码不支持问题求助
技术解释:CURLOPT_POST vs CURLOPT_CUSTOMREQUEST 引发的Proxmox API 501错误
核心差异:两个curl选项的行为逻辑
curl_setopt($ch, CURLOPT_POST, 1);:这是curl为标准POST请求设计的选项。当你设置这个选项但未通过CURLOPT_POSTFIELDS提供任何请求体数据时,PHP 8.2搭配的curl版本会默认采用chunked传输编码发送请求——因为没有明确指定Content-Length头,curl会自动选择chunked方式处理空请求体。而Proxmox的API服务器(底层基于nginx或自定义服务)不支持这种编码方式,因此返回501 chunked transfer encoding not supported错误。curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");:这个选项强制curl发送指定的HTTP方法(此处为POST),但不会触发curl内置的POST请求处理逻辑。当没有请求体时,curl会发送一个无请求体的POST请求,且不会自动添加chunked编码头,而是明确告知服务器请求体长度为0(或直接省略请求体部分),这完全符合Proxmox停止虚拟机接口对请求格式的要求,因此请求成功。
为什么获取认证票据的接口不受影响?
获取认证票据的API接口需要传递POST数据(如用户名、密码),此时使用CURLOPT_POST=1时,curl会根据POST数据的长度自动设置Content-Length头,不会采用chunked编码,因此服务器可以正常处理请求。
内容的提问来源于stack exchange,提问作者Алексей Никитченко
相关产品推荐
相关产品推荐

