PHP,curl,无法设置自定义标头

时间:2015-11-18 13:02:30

标签: php curl

不知何故,我无法为PHP curl调用设置自定义标头。以下代码在我的服务器上运行(x86_64-redhat-linux-gnu,curl版本7.40.0),但它不适用于我们客户的服务器(x86_64-pc-linux-gnu,curl版本7.43.0)。

    $bodyString = json_encode($body);
    $options = array(
        CURLOPT_URL => $url,
        CURLOPT_HEADER => 0,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_FOLLOWLOCATION => TRUE,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD => "$customerId:$licenceKey",
        CURLOPT_SSL_VERIFYPEER => FALSE,
        CURLINFO_HEADER_OUT  => TRUE,

        CURLOPT_HTTPHEADER => array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($bodyString),
        ),
        CURLOPT_POSTFIELDS => $bodyString
    );

    log("Requesting [".$url."]...");

    $cURL = curl_init();
    curl_setopt_array($cURL, $options);
    $response = curl_exec($cURL);

    log("Header dump:\n ".curl_getinfo($cURL, CURLINFO_HEADER_OUT));

在我们的服务器上,它按预期工作,CURLINFO_HEADER_OUT返回:

POST /api/rest_call?p1=true&p2=true HTTP/1.1
Authorization: Basic *****
Host: admin.myserver.net
Accept: */*
Content-Type: application/json
Content-Length: 119

在客户服务器上,CURLINFO_HEADER_OUT返回一个空字符串。请求的服务器返回“415 Unsupported media type”,因为没有传输“Content-Type”。

更新:按照Php - Debugging Curl的提示创建了详细的日志文件。以下是其中的一部分:

POST /api/rest_call?p1=true&p2=true HTTP/1.1
Host: admin.yoochoose.net
Accept: */*

cURL似乎忽略了所有自定义标头和(!)身份验证信息。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

解决。必须删除CURLOPT_FOLLOWLOCATION。对于POST请求,无论如何它都是无用的。

我无法深入调查。这不是我的服务器。据我所知,它与PHP安全模式或类似限制相关联。它会阻止www文件夹和符号链接使用之外的本地文件系统请求。它会影响CURLOPT_FOLLOWLOCATION选项。

PHP safe_mode problem using curl

这是一个老问题。但我不知道,它也会从请求中删除所有标题。

答案 1 :(得分:0)

您不能在标题中使用包含“ _”的名称,请尝试使用“-”。

如果需要,您需要在nginx配置中将underscores_in_headers设置为开。

更多详细信息here