Laravel 10 中推荐使用 Guzzle 发送 HEAD 请求,因其语义明确、支持中间件与错误细分;手动 cURL 需设 CURLOPT_NOBODY=true 并避免 CURLOPT_HEADER=true,注意服务器可能拦截 HEAD。

在 Laravel 10 中,框架本身不直接封装 cURL 的 HEAD 请求调用,但你可以安全、可控地使用原生 PHP 的 curl_init() 发送 HEAD 请求——关键是正确设置选项并避免干扰响应体。
手动用 cURL 发送 HEAD 请求
HEAD 请求的核心是只获取响应头,不传输响应体。需显式设置 CURLOPT_NOBODY => true,同时关闭 body 输出和 header 输出(除非你专门调试):
-
必须启用
CURLOPT_NOBODY:告诉 cURL 只请求头信息,不拉取 body -
禁用
CURLOPT_RETURNTRANSFER不影响结果:即使设为true,返回值也为空字符串(因无 body),但建议保留它以便统一处理 -
不要设
CURLOPT_HEADER => true:这会把响应头混在返回内容里,破坏结构;应通过curl_getinfo($ch, CURLINFO_HTTP_CODE)和curl_getinfo($ch)提取标准信息 -
记得调用
curl_close():防止句柄泄漏,尤其在 Artisan 命令或队列任务中
示例代码:
利用农业相机拍摄植物叶片高分辨率图像,通过AI视觉技术检测叶片卷曲方向(向上卷曲或向下卷曲)
$ch = curl_init('https://api.example.com/health');
curl_setopt($ch, CURLOPT_NOBODY, true); // 关键:只取头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 方便后续判断
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$server = curl_getinfo($ch, CURLINFO_SERVER);
curl_close($ch);
if ($response === false) {
$error = curl_error($ch);
// 处理网络错误(DNS失败、超时等)
} else {
// 成功收到响应头,可基于 $httpCode 或 $contentType 做逻辑分支
}
在 Laravel 10 中更推荐的方式:用 Guzzle
Laravel 10 默认已安装 Guzzle(v7.5+),它对 HEAD 请求支持更干净,语义明确,且自动复用连接池:
- 用
$client->head($url)直接发起,返回ResponseInterface - 响应体为空,但所有头信息、状态码、重定向信息都可通过
$response->getHeaders()、$response->getStatusCode()获取 - 天然支持中间件、重试、超时分设(如
connect_timeout和read_timeout)
示例:
$client = new \GuzzleHttp\Client(['timeout' => 5]);
try {
$response = $client->head('https://api.example.com/status');
$statusCode = $response->getStatusCode(); // 如 200、404、302
$headers = $response->getHeaders(); // ['Content-Type' => ['application/json']]
} catch (\GuzzleHttp\Exception\RequestException $e) {
if ($e->hasResponse()) {
$statusCode = $e->getResponse()->getStatusCode();
} else {
// 网络层失败:DNS、连接拒绝、SSL 错误等
}
}
注意事项与避坑点
实际使用中容易忽略几个关键细节:
-
别用
Http::head()facade:Laravel 的Httpfacade 是 Guzzle 封装层,虽支持head()方法,但屏蔽了底层连接控制和错误细分,不适合生产级 API 健康检查 - Nginx/Apache 可能拦截或改写 HEAD 请求:某些服务器配置会把 HEAD 自动转成 GET,或过滤掉自定义头;建议在目标服务端加日志确认请求方法是否真实到达
-
HEAD 请求无法携带请求体:即使你设了
CURLOPT_POSTFIELDS或json_encode,绝大多数服务端会忽略或直接 400;如有认证需求,只能通过 Header(如Authorization)传

















