本文详解如何在 php 中使用 curl 发起带认证和自定义请求头的 get 请求,纠正将 shell 命令误写入 `curlopt_url` 的常见错误,并提供可直接运行的安全示例。
在 PHP 中使用 cURL 发起 HTTP 请求时,一个常见误区是把终端命令(如 curl -u user:pass -H "Accept: text/csv" ...)直接拼接进 CURLOPT_URL——这会导致 cURL 尝试访问一个非法 URL,最终返回空结果或报错。正确的做法
是:URL 仅包含协议、主机、路径和查询参数;认证、请求头、方法等需通过独立的 curl_setopt() 选项设置。
以下是标准、安全、可复用的 PHP cURL GET 请求模板(支持 Basic Auth 和自定义 Header):
'chiave: "2025-01-26_14:46"',
'range' => 160000,
'batch_size'=> 500,
'fields' => 'ALERTID, chiave'
]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// ✅ 设置 Accept 请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: text/csv',
'User-Agent: PHP-cURL/1.0'
]);
// ✅ 正确设置 Basic 认证(推荐方式)
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
// ⚠️ 注意:不要使用 CURLOPT_POST + CURLOPT_POSTFIELDS 实现 GET 认证!
// 上述答案中建议的 CURLOPT_POST=1 是错误的——GET 请求不应设为 POST,
// 且 CURLOPT_POSTFIELDS 用于提交请求体,不适用于 Basic Auth。
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($result === false) {
throw new RuntimeException("cURL error: {$error} (HTTP {$httpCode})");
}
echo $result;
?>关键要点说明:
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer your-token-here']);
遵循以上规范,即可稳定、清晰、安全地完成带认证与请求头的 PHP cURL GET 调用。