このスレッドで@Geoffreyの優れた答えを利用して...
このスレッドで提供されている他のソリューションのいくつかは、これを正しく行っていません。
- オンの場合、またはサーバーが100コードで応答する場合、オンの分割
\r\n\r\n
は信頼できません。CURLOPT_FOLLOWLOCATION
- を介してヘッダーのサイズを検出すること
CURLINFO_HEADER_SIZE
も、特にプロキシが使用されている場合、または同じリダイレクトシナリオの一部である場合は、常に信頼できるとは限りません。
ヘッダーを取得する最も信頼できる方法は、を使用することCURLOPT_HEADERFUNCTION
です。その後、あなたは取り除くことができcurl_setopt($ch, CURLOPT_HEADER, 1);
、あなたの体はヘッダーなしできれいになります。
これは、PHPクロージャを使用してこれを実行する非常にクリーンな方法です。また、サーバーとHTTPバージョン間で一貫した処理を行うために、すべてのヘッダーを小文字に変換します。
$ch = curl_init();
$headers = [];
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Run the following function for each header received
// Note: Does NOT handle multiple instances of the same header. Later one will overwrite.
// Consider handling that scenario if you need it.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) {
$len = strlen($header);
$header = explode(':', $header, 2);
if (count($header) >= 2)
$headers[strtolower(trim($header[0]))] = trim($header[1]);
return $len;
});
$data = curl_exec($ch);
print_r($headers);