Kurz gesagt: cURL blendet Antwort-Header standardmäßig aus. Verwenden Sie-i, um die Header zusammen mit dem Body anzuzeigen,-Ifür eine HEAD-Anfrage, die nur Header zurückgibt,-vfür die vollständige Debugging-Auswertung von Anfragen und Antworten und-Dum Header in eine Datei zu speichern. Für modernes Scripting ermöglicht cURL 7.83+ das Extrahieren einzelner Header oder das Ausgeben aller Header als JSON mit der-wwrite-out-Option.
Einführung
HTTP-Antwort-Header sind die Metadaten, die ein Server mit jeder Antwort zurücksendet und die alles abdecken, vom Inhaltstyp und Caching-Richtlinien bis hin zu Rate-Limit-Zählern und Sicherheitsanweisungen. Wenn Sie eine unzuverlässige API debuggen, überprüfen, ob ein CDN die richtigen Cache-Header liefert, oder kontrollieren, ob eine Website die richtige CORS-Richtlinie festlegt, ist cURL das erste Tool, nach dem die meisten Entwickler greifen.
Standardmäßig gibt cURL nur den Antworttext an stdout aus, was bedeutet, dass Sie in cURL explizit nach den HTTP-Antwort-Headern fragen müssen, bevor Sie diese sehen können. Die Herausforderung besteht darin, dass cURL mindestens ein halbes Dutzend Flags und Techniken zur Anzeige dieser Header bietet, wobei jedes für einen anderen Arbeitsablauf optimiert ist. Sollten Sie zu -i, -I, -voder -D? Was ist mit den neueren -w Ausgabevariablen, mit denen Sie einen einzelnen Header nach Namen abrufen oder jeden Header als JSON exportieren können?
Dieser Leitfaden führt Sie durch alle Ansätze zur Anzeige von HTTP-Antwort-Headern in cURL, vom einfachsten Einzeiler bis hin zu automatisierungsfreundlichen Skript-Rezepten, damit Sie das richtige Werkzeug für die jeweilige Aufgabe auswählen können, ohne jeden Abschnitt der Man-Seite auswendig lernen zu müssen.
Warum Antwort-Header für Debugging und Scraping wichtig sind
Jede HTTP-Antwort enthält eine Reihe von Headern, die dem Client mitteilen, wie die Nutzdaten zu interpretieren sind. Ein Content-Type Header, der application/json bedeutet das eine; text/html bedeutet etwas anderes. Über die Grundlagen hinaus geben Header Aufschluss über das Caching-Verhalten (Cache-Control, ETag), Authentifizierungsanforderungen (WWW-Authenticate), den Status der Ratenbegrenzung (X-RateLimit-Remaining) sowie Sicherheitsrichtlinien (Strict-Transport-Security, Content-Security-Policy).
Für Web-Scraping-Anwender sind Antwort-Header besonders aufschlussreich. Sie können Ihnen verraten, ob ein Server seine Antworten komprimiert, ob Ihre Anfragen über eine Kette von Zwischen-URLs umgeleitet werden oder ob Sie kurz davor stehen, eine Ratenbegrenzung zu erreichen. Deshalb ist das Erlernen der schnellen und genauen Überprüfung von HTTP-Antwort-Headern in cURL eine grundlegende Fähigkeit für jeden, der an der Befehlszeile mit HTTP arbeitet.
So zeigen Sie HTTP-Antwort-Header in cURL an: Schnellübersicht
Bevor wir uns den Beispielen zuwenden, finden Sie hier eine Vergleichstabelle, die Sie sich als Lesezeichen speichern können. Sie ordnet jedem Flag sein Verhalten und das Szenario zu, in dem es am nützlichsten ist, wenn Sie HTTP-Antwort-Header in cURL anzeigen müssen.
|
Flag / Technik |
Was es bewirkt |
Am besten geeignet für |
|---|---|---|
|
|
Gibt Antwort-Header und Body gemeinsam aus |
Schnelle visuelle Überprüfung einer Antwort |
|
|
Sendet eine HEAD-Anfrage, gibt nur die Header aus |
Schnelle Header-Prüfung, wenn Sie den Body nicht benötigen |
|
|
Zeigt vollständige Anfrage und Antwort an, einschließlich TLS-Handshake |
Umfassende Fehlerbehebung der gesamten HTTP-Transaktion |
|
|
Speichert Antwort-Header in einer Datei |
Protokolliert Header getrennt vom Hauptteil |
|
|
GET-Anfrage, gibt nur Header auf stdout aus |
Wenn sich HEAD-Antworten von GET-Antworten unterscheiden |
|
|
Extrahiert einen einzelnen Header nach Namen (cURL 7.83+) |
Skriptgesteuerte Überprüfung eines bestimmten Headers |
|
|
Gibt alle Header als JSON aus (cURL 7.83+) |
Weiterleitung von Headern an |
Wählen Sie die Zeile aus, die Ihrem Arbeitsablauf entspricht, und lesen Sie dann den entsprechenden Abschnitt unten für Details und Beispiele.
Anzeige von Antwort-Headern neben dem Body (-i)
Der einfachste Weg, HTTP-Antwort-Header in cURL anzuzeigen, ist das -i Flag (vollständige Form: --include). Es weist cURL an, den vollständigen Satz der Antwort-Header der Body-Ausgabe voranzustellen, getrennt durch eine Leerzeile.
curl -i https://httpbin.org/getDie Ausgabe beginnt mit der Statuszeile (HTTP/1.1 200 OK), gefolgt von jedem Header in einer eigenen Zeile, dann einer Leerzeile und schließlich dem Antworttext. Dies ist eine GET-Anfrage, keine HEAD-Anfrage, sodass Sie die tatsächliche Antwort erhalten, die der Server an einen Browser ausgeben würde.
Verwenden Sie -i , wenn Sie sich mit einem einzigen Terminalbefehl einen schnellen Überblick über Header und Body verschaffen möchten. Der Nachteil ist, dass Header und Body in einem Stream gemischt sind, was die programmatische Auswertung erschwert. Für Skripte empfiehlt sich eine der späteren Techniken (wie -D oder -w) in der Regel besser geeignet.
Nur Antwort-Header abrufen (-I und --head)
Wenn Sie nur die Header benötigen und der Textkörper für Sie völlig irrelevant ist, verwenden Sie -I (oder die entsprechende Langform, --head). Beide Flags senden eine HTTP-HEAD-Anfrage, die den Server nur um die Header bittet.
curl -I https://httpbin.org/getDie Ausgabe besteht lediglich aus der Statuszeile und den Headern. Kein Textkörper, kein überflüssiger Ballast. Die --head Schreibweise bewirkt dasselbe, ist aber in Shell-Skripten übersichtlicher, sodass Ihre Absicht für jeden, der den Code überprüft, klar erkennbar ist.
Eine Einschränkung: Eine HEAD-Antwort ist nicht immer identisch mit einer GET-Antwort. Manche Server geben bei HEAD-Anfragen andere Header zurück (oder lassen bestimmte Header ganz weg). Wenn du ein Problem mit einem Header beheben willst, der nur bei einem echten GET-Aufruf erscheint, führt dich dieses Flag in die Irre.
Nur Header bei einer GET-Anfrage ausgeben
Die Abhilfe ist die -s -o /dev/null -D - Technik, die eine vollständige GET-Anfrage sendet, aber den Body verworfen und nur die Antwort-Header auf stdout ausgibt:
curl -s -o /dev/null -D - https://httpbin.org/getHier ist die Funktion der einzelnen Teile: -s schaltet die Fortschrittsanzeige aus, -o /dev/null sendet den Body ins Leere und -D - schreibt die Header in die Standardausgabe (der Bindestrich steht für „stdout“ anstelle eines Dateinamens). So erhältst du die tatsächlichen GET-Header ohne die Störsignale des Hauptteils, und dies ist ein unverzichtbares Muster, wenn du in cURL genaue HTTP-Antwort-Header benötigst, HEAD jedoch unzuverlässig ist.
Vollständige Anfrage und Antwort im Verbose-Modus (-v) überprüfen
Der Verbose-Modus ist das Schweizer Taschenmesser für das HTTP-Debugging. Das -v (oder --verbose) bewirkt, dass cURL die gesamte Transaktion ausgibt: Details zum TLS-Handshake, Request-Header, Response-Header und den Body.
curl -v https://httpbin.org/getIn der Ausgabe sind die Zeilen, denen > sind die vom Client gesendeten Anfrage-Header, Zeilen mit dem Präfix < sind die vom Server zurückgegebenen Antwort-Header, und Zeilen, denen * sind Informationsmeldungen von cURL selbst (Verbindungsinformationen, TLS-Verhandlung usw.).
Um die Ausgabe zu vereinfachen, kombinieren Sie -v mit -s , um die Fortschrittsanzeige zu unterdrücken. Wenn Sie in einem Skript nur die Header-Zeilen aus der ausführlichen Ausgabe erfassen möchten, können Sie stderr umleiten (wo -v seine Debug-Informationen schreibt) umleiten und filtern:
curl -vs https://httpbin.org/get 2>&1 | grep '^<'Dies leitet sowohl stdout als auch stderr zusammen und behält dann nur die Zeilen bei, die mit <, sodass Sie eine übersichtliche Liste der Antwort-Header aus der ausführlichen cURL-Ausgabe erhalten. Dies eignet sich hervorragend für schnelles, einmaliges Debugging, für Skripte in der Produktion sollten Sie jedoch die im Folgenden behandelten, strukturierteren Ansätze in Betracht ziehen.
Antwort-Header in eine Datei speichern (-D)
Das -D Flag (kurz für --dump-header) schreibt die Antwort-Header in eine Datei statt in stdout. Kombinieren Sie es mit -o , um den Body separat zu speichern:
curl -D headers.txt -o body.html https://example.comNach Ausführung dieses Befehls headers.txt enthält alle Antwort-Header und body.html den Seiteninhalt. Dies ist ideal für die Protokollierung, bei der Sie Header und Body nebeneinander archivieren möchten, um sie später zu überprüfen.
Für die Protokollierung mit Zeitstempel (nützlich in Überwachungsskripten) generieren Sie den Dateinamen dynamisch:
curl -D "headers_$(date +%Y%m%d_%H%M%S).txt" -o /dev/null https://example.comJeder Durchlauf erstellt eine neue Datei wie headers_20240615_143022.txt, sodass Sie verfolgen können, wie sich die HTTP-Antwort-Header in cURL im Laufe der Zeit ändern. Kombinieren Sie dies mit einem Cron-Job, und Sie erhalten einen schlanken Header-Monitor ohne Tools von Drittanbietern.
Extrahieren Sie bestimmte Header mit grep und awk
Manchmal interessiert dich nur ein bestimmter Header, wie Content-Type oder X-RateLimit-Remaining. Durch die Weiterleitung der cURL-Ausgabe über Standard-Unix-Tools gelangen Sie schnell ans Ziel.
Rufen Sie einen einzelnen Header anhand seines Namens mit dem groß-/kleinschreibungsunabhängigen grep ab:
curl -sI https://httpbin.org/get | grep -i "content-type"Um nur den Wert (ohne den Header-Namen) zu isolieren, fügen Sie cut oder awk:
curl -sI https://httpbin.org/get | grep -i "content-type" | cut -d':' -f2- | xargsDer cut Befehl trennt am Doppelpunkt und behält alles danach, während xargs die umgebenden Leerzeichen entfernt. Alternativ awk kann dies in einem Schritt erledigt werden:
curl -sI https://httpbin.org/get | awk -F': ' '/^[Cc]ontent-[Tt]ype/ {print $2}'Achten Sie auf teilweise Namensübereinstimmungen. Eine Suche nach Content würde auch Content-Length, Content-Encodingund alles andere, was genauso beginnt. Suchen Sie immer nach dem vollständigen Header-Namen, gefolgt von einem Doppelpunkt, um Fehlalarme zu vermeiden.
Moderne Header-Extraktion mit -w (cURL 7.83+)
Ab etwa Version 7.83 (veröffentlicht Anfang 2022) führte cURL zwei Ausgabevariablen ein, die das Extrahieren von HTTP-Antwort-Headern in cURL-Skripten vereinfachen: %header{name} für einen einzelnen Header und %{header_json} für alle Header als JSON.
Extrahieren Sie einen Header sauber, ohne grep:
curl -s -o /dev/null -w '%header{content-type}' https://httpbin.org/getDies gibt nur den Wert des Content-Type Headers aus. Kein Parsing, keine Pipes, keine Regex.
Um jeden Antwort-Header als JSON-Objekt zu erhalten, verwenden Sie:
curl -s -o /dev/null -w '%{header_json}' https://httpbin.org/getDie Ausgabe ist gültiges JSON, was bedeutet, dass du sie direkt in jq , um sie übersichtlich darzustellen oder Felder zu extrahieren:
curl -s -o /dev/null -w '%{header_json}' https://httpbin.org/get | jq '.["content-type"]'Wenn doppelte Header-Namen auftreten (z. B. mehrere Set-Cookie Header), gruppiert cURL diese beim ersten Vorkommen und sammelt alle Werte in einem JSON-Array, sodass Sie niemals Daten verlieren.
Ein wichtiger Hinweis: Diese Ausgabevariablen erfordern cURL 7.83 oder höher. Führen Sie curl --version , um Ihre Version zu überprüfen. Wenn Sie eine ältere Version verwenden, bleibt der grep/awk Vorgehensweise aus dem vorherigen Abschnitt die beste Option.
Rezepte für Skripting und Automatisierung
Sobald Sie HTTP-Antwort-Header in cURL extrahieren können, besteht der nächste Schritt darin, wiederholbare Workflows darum herum aufzubauen. Hier sind drei Muster, die sich gut für die Prüfung von Headern in großem Maßstab eignen.
Prüfen Sie einen bestimmten Header über mehrere URLs hinweg:
while IFS= read -r url; do
val=$(curl -s -o /dev/null -w '%header{strict-transport-security}' "$url")
echo "$url → $val"
done < urls.txtGeben Sie eine Datei mit URLs ein und erhalten Sie einen schnellen Bericht darüber, welche davon den Strict-Transport-Security Header setzen.
Überwachen Sie Header-Änderungen im Zeitverlauf mit diff:
curl -sI https://example.com > /tmp/headers_prev.txt
# ... wait, or run via cron ...
curl -sI https://example.com > /tmp/headers_now.txt
diff /tmp/headers_prev.txt /tmp/headers_now.txtBinden Sie dies in einen Cron-Job ein und senden Sie die Diff-Ausgabe an einen Slack-Webhook oder per E-Mail. Dies ist eine einfache Methode, um unerwartete Konfigurationsänderungen zu erkennen.
Erstellen Sie einen Shell-Alias für regelmäßige Überprüfungen:
alias hcheck='curl -s -o /dev/null -D - -w "\n"'Jetzt kannst du hcheck https://example.com eingeben, um mit einer sauberen GET-Anfrage schnell die Antwort-Header von jeder beliebigen URL auszulesen.
Fehlerbehebung bei häufigen Header-Problemen
Selbst einfache Header-Prüfungen können schiefgehen. Im Folgenden finden Sie drei Situationen, auf die Sie bei der Arbeit mit HTTP-Antwort-Headern in cURL wahrscheinlich stoßen werden, zusammen mit den Flags, die diese beheben.
SSL-Zertifikatsfehler
Wenn cURL die Verbindung aufgrund eines Zertifikatsproblems verweigert, können Sie die Überprüfung mit -k (oder --insecure):
curl -kI https://self-signed.example.comVerwenden Sie dies nur in Entwicklungs- oder internen Testumgebungen. In der Produktion ist es besser, das richtige CA-Bundle mit --cacert /path/to/ca-bundle.crt , damit die Verbindung tatsächlich verifiziert wird.
Weiterleitungsketten und fehlende Header
Standardmäßig folgt cURL keinen Weiterleitungen. Wenn eine URL einen 301- oder 302-Status zurückgibt, sehen Sie nur die Header der ursprünglichen Antwort. Fügen Sie -L (oder --location) hinzu, um der Kette zu folgen:
curl -LI https://example.comUm die Header bei jedem Schritt (nicht nur am endgültigen Ziel) zu erfassen, kombinieren Sie -L mit -D:
curl -L -D all_headers.txt -o /dev/null https://example.comDie Datei all_headers.txt enthält Header-Blöcke von jeder Weiterleitung, getrennt durch Leerzeilen. Sie können auch --max-redirs 5 festlegen, um die Anzahl der Hops zu begrenzen und Endlosschleifen zu vermeiden.
Zeichenkodierung und Komprimierung
Viele Server komprimieren Antworten mit gzip oder Brotli, was dazu führen kann, dass die Rohdaten des Body-Teils wie Unsinn aussehen. Das --compressed Flag weist cURL an, den entsprechenden Accept-Encoding Header zu senden und die Antwort automatisch zu dekomprimieren:
curl --compressed -i https://example.comDies ändert nichts an den Headern selbst, stellt aber sicher, dass Sie den Body zusammen mit ihnen lesen können. Wenn Sie nur die Header überprüfen, spielt die Komprimierung keine Rolle, aber sie ist von Bedeutung, wenn Sie -i , um beides anzuzeigen.
Wichtige Erkenntnisse
- Verwenden Sie
-ifür schnelle visuelle Überprüfungen, bei denen die Antwort-Header inline mit dem Body angezeigt werden, und-Iwenn Sie nur Header aus einer HEAD-Anfrage benötigen. - Das
-s -o /dev/null -D -Muster ist unerlässlich, wenn sich HEAD-Antworten von GET-Antworten unterscheiden: Es liefert Ihnen echte GET-Header ohne störende Textinhalte. - Der Verbose-Modus (
-v) ist das leistungsstärkste Werkzeug in Ihrem Arsenal und zeigt Anfrage-Header, Antwort-Header und TLS-Details auf einen Blick an. - cURL 7.83+ schreibt Variablen aus (
%header{name}und%{header_json}) machen grep/awk-Pipelines überflüssig und lassen sich nahtlos in JSON-basierte Workflows integrieren. - Kombinieren
-Lmit-D, um Header bei jedem Weiterleitungsschritt zu erfassen, und überprüfen Sie immer Ihre cURL-Version, bevor Sie sich auf neuere Funktionen verlassen.
FAQ
Was ist der Unterschied zwischen curl -i und curl -I?
curl -i sendet eine Standard-GET-Anfrage und fügt die Antwort-Header über dem Body in die Ausgabe ein. curl -I sendet eine HEAD-Anfrage, die nur Header ohne Textkörper zurückgibt. Die Kleinbuchstaben -i erhalten Sie die vollständige Antwort; die Großbuchstaben -I ist schneller, kann aber auf manchen Servern andere Header zurückgeben als ein echter GET.
Wie kann ich cURL-Antwort-Header als JSON ausgeben?
Verwenden Sie die -w '%{header_json}' Variable `write-out`, die ab cURL 7.83 verfügbar ist. Führen Sie curl -s -o /dev/null -w '%{header_json}' <URL> , um ein gültiges JSON-Objekt zu erhalten, das alle Header enthält. Leiten Sie das Ergebnis über eine Pipe an jq , um es übersichtlich darzustellen oder Felder zu extrahieren. Doppelte Header werden automatisch in JSON-Arrays gruppiert.
Wie kann ich Antwort-Header in PowerShell mit curl anzeigen?
Unter Windows curl in PowerShell ein Alias für Invoke-WebRequest. Führen Sie (Invoke-WebRequest -Uri "https://example.com" -Method Head).Headers aus, um eine Hash-Tabelle der Antwort-Header anzuzeigen. Wenn Sie die eigentliche cURL-Binärdatei verwenden möchten, rufen Sie curl.exe -I https://example.com , um den Alias zu umgehen und die in dieser Anleitung beschriebenen Flags zu verwenden.
Wie kann ich mit cURL die Header für jede Weiterleitung in einer Kette anzeigen?
Kombinieren Sie -L (Weiterleitungen verfolgen) mit -D (Header ausgeben) wie folgt: curl -L -D headers.txt -o /dev/null https://example.com. Die resultierende Datei enthält separate Header-Blöcke für jeden Umleitungsschritt, getrennt durch Leerzeilen. Sie können auch curl -Lv verwenden, um die Header jedes Schritts in Echtzeit auf stderr anzuzeigen.
Fazit
Das Überprüfen von HTTP-Antwort-Headern in cURL ist eine dieser Fähigkeiten, die sich jeden Tag auszahlt, sobald man sie einmal beherrscht. Für schnelle Überprüfungen -i und -I bringen Sie mit einem einzigen Befehl ans Ziel. Wenn Sie einen tieferen Einblick benötigen, -v zeigt die vollständige Transaktion an und -D ermöglicht es dir, Header zur späteren Analyse in Dateien zu protokollieren. Und wenn du automatisierte Pipelines aufbaust, kannst du mit den neueren -w Write-out-Variablen (verfügbar in cURL 7.83+) ermöglichen es dir, Header als sauberes JSON ohne komplizierte Textverarbeitung zu extrahieren.
Der Schlüssel liegt darin, das richtige Flag für die jeweilige Aufgabe zu wählen. Nutzen Sie die Schnellübersichtstabelle aus diesem Leitfaden als Spickzettel und bauen Sie auf den Skript-Rezepten auf, um einmalige Befehle in wiederholbare Prüfungen umzuwandeln.
Wenn Ihre cURL-Skripte auf Anti-Bot-Schutzmaßnahmen, CAPTCHAs oder IP-Sperren stoßen, bevor Sie überhaupt die Möglichkeit haben, die Header zu überprüfen, kann WebScrapingAPI die Anforderungsschicht für Sie übernehmen und die Proxy-Rotation sowie die Umgehung von Sperren hinter einem einzigen API-Endpunkt verwalten, sodass Sie sich auf die Daten statt auf die Infrastruktur konzentrieren können.




