不知何故,我无法为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似乎忽略了所有自定义标头和(!)身份验证信息。有什么想法吗?
答案 0 :(得分:0)
解决。必须删除CURLOPT_FOLLOWLOCATION
。对于POST请求,无论如何它都是无用的。
我无法深入调查。这不是我的服务器。据我所知,它与PHP安全模式或类似限制相关联。它会阻止www
文件夹和符号链接使用之外的本地文件系统请求。它会影响CURLOPT_FOLLOWLOCATION
选项。
PHP safe_mode problem using curl
这是一个老问题。但我不知道,它也会从请求中删除所有标题。
答案 1 :(得分:0)