PHP curl_exec返回100 Continue后接404 Not Found问题排查
问题根因
你的代码存在两个核心配置错误,直接触发服务端返回404:
CURLOPT_POSTFIELDS传参格式错误:该参数必须传入JSON格式字符串,如果传入PHP数组,cURL会自动将请求编码为multipart/form-data格式,强制覆盖你手动设置的Content-Type: application/json请求头,自动追加boundary分隔符,和你日志里打印的Content-Type: application/json; boundary=----------------------------d7326044efb7异常头完全一致。服务端收到格式不符合预期的请求,无法匹配对应接口路由就会返回404。- cURL默认会自动添加
Expect: 100-continue请求头,逻辑是先发送不带请求体的头信息,等服务端返回100 Continue后再发送实际请求体,很多接口服务端会直接拒绝这种不符合预期的请求流程,正好对应你日志里先收到100 Continue再收到404的现象。
另外你开启了CURLOPT_HEADER=TRUE配置,最终返回结果会包含响应头内容,即使请求成功也拿不到纯JSON响应体。
修复后可运行代码
$curl = curl_init(); // 组装POST参数并转成JSON字符串 $postData = json_encode([ "param1" => "value1", "param2" => "value2" ]); curl_setopt($curl, CURLOPT_URL, "https://xxxxxxx.com/getkey"); curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); // 客户端证书配置,提前确认PHP运行进程对两个证书文件有可读权限 curl_setopt($curl, CURLOPT_SSLCERT, "/var/www/html/certs/client.crt"); curl_setopt($curl, CURLOPT_SSLKEY, "/var/www/html/certs/client.key"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 不需要响应头时设为false,避免头信息和响应体混杂 curl_setopt($curl, CURLOPT_HEADER, false); // 配置请求头,通过传空值禁用Expect:100-continue逻辑 $headers = [ 'Content-Type: application/json', 'Expect:', 'Content-Length: ' . strlen($postData) ]; curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_POST, true); // 传入JSON字符串,禁止传PHP数组 curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); $result = curl_exec($curl); // 增加错误捕获方便排查问题 if (curl_errno($curl)) { $errMsg = curl_error($curl); curl_close($curl); throw new RuntimeException('cURL请求异常:' . $errMsg); } curl_close($curl); return $result;
修复校验标准
重新运行代码后开启verbose日志,会看到两个明确变化:
- 请求头里的Content-Type为纯
application/json,不再携带boundary后缀 - 请求头中不再出现
Expect: 100-continue字段,不会再单独收到100 Continue响应
此时即可正常获取预期的JSON响应。
内容的提问来源于stack exchange,提问作者Jai Thilak
相关产品推荐
相关产品推荐

