我想获取资源的标头而不实际下载它,特别是因为我正在尝试检查较大媒体文件的标头。然而,URL 位于重定向后面,我需要遵循重定向来确定媒体的实际标头。我不确定有多少重定向,并且每个 URL 可能会有所不同。
在下面的答案中,它解释了如何使用 POST 和 HEAD 请求获取标头:
curl -s -I -X POST http://www.google.com
https://stackoverflow.com/a/38679650
这适用于我的用例(使用 GET 而不是 POST),因为我可以获取标头,例如下一个重定向位置,而无需实际下载媒体。然后我可以在重定向后递归地执行此操作,直到获得实际媒体的标题。
但是我不知道如何使用 php 执行 BOTH HEAD and GET 请求。使用某些库(例如 guzzle)可以实现这一点吗?
一种可能是在收到所需标头后中止 GET 请求。示例:
$url = "http://www.example.com/";
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => true,
CURLINFO_HEADER_OUT => true,
CURLOPT_HTTPGET => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADERFUNCTION => 'requestHeaderCallback',
));
$curlResult = curl_exec($ch);
curl_close($ch);
function requestHeaderCallback($ch, $header) {
$matches = array();
if (preg_match("/^HTTP/\d.\d (\d{3}) /")) {
if ($matches[1] < 300 || $matches[1] >= 400) {
return 0;
}
}
return strlen($header);
}