You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 08:30:24