PHP CURL自定义请求头不生效:拆分设置为何正常?
PHP CURL自定义请求头无法被服务器接收的原因分析
我花了数小时调试PHP CURL代码,始终无法让服务器接收到自定义请求头。仅将请求头设置单独拆分到另一个curl_setopt_array调用后,代码就正常运行了,以下是具体问题和原因解析:
原代码(无法正常运行)
curl_setopt_array($curlHandler, [ CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $data_string, CURLOPT_RETURNTRANSFER => true, CURLOPT_VERBOSE => true, CURLOPT_STDERR => fopen($fp, 'w'), CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_HTTPHEADER => array( 'Accept: application/json', 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string), 'X-Bearer-Token: 1234567890', 'Authorization: Bearer 1234567890'), ]);
修改后代码(正常运行)
curl_setopt_array($curlHandler, [ CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $data_string, CURLOPT_RETURNTRANSFER => true, CURLOPT_VERBOSE => true, CURLOPT_STDERR => fopen($fp, 'w'), CURLOPT_SSL_VERIFYHOST => 2, ]); curl_setopt_array($curlHandler, [ CURLOPT_HTTPHEADER => array( 'Accept: application/json', 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string), 'X-Bearer-Token: 1234567890', 'Authorization: Bearer 1234567890'), ]);
核心原因
问题出在curl_setopt_array的参数处理顺序与curl内部头信息生成逻辑的冲突:
- 当在同一个
curl_setopt_array调用中同时设置CURLOPT_POSTFIELDS和CURLOPT_HTTPHEADER时,curl处理CURLOPT_POSTFIELDS后会自动生成/覆盖部分HTTP头(比如自动计算并设置Content-Length),这会导致你手动设置的自定义头(包括X-Bearer-Token、Authorization)被意外覆盖或未正确生效。 - 拆分调用后,先完成POST相关参数的设置(此时curl自动生成必要的基础头),再单独设置
CURLOPT_HTTPHEADER,自定义头会直接覆盖curl自动生成的对应字段,且所有自定义头都会被正确传递到服务器,不会被后续参数逻辑覆盖。
额外提示:其实无需手动设置Content-Length,curl会根据$data_string的实际长度自动计算并设置,手动指定反而可能因编码、特殊字符等问题导致长度不匹配,引发额外异常。
内容的提问来源于stack exchange,提问作者UnknownX
相关产品推荐
相关产品推荐

