Zurück zum Blog
Die Wissenschaft des Web-Scrapings
Suciu DanLast updated on Apr 29, 202611 min read

HTTP-Antwort-Header in cURL: Jedes Flag, jede Technik und jedes Skripting-Rezept

HTTP-Antwort-Header in cURL: Jedes Flag, jede Technik und jedes Skripting-Rezept
Kurz gesagt: cURL blendet Antwort-Header standardmäßig aus. Verwenden Sie -i , um die Header zusammen mit dem Body anzuzeigen, -I für eine HEAD-Anfrage, die nur Header zurückgibt, -v für die vollständige Debugging-Auswertung von Anfragen und Antworten und -D um 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 -w write-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

-i (--include)

Gibt Antwort-Header und Body gemeinsam aus

Schnelle visuelle Überprüfung einer Antwort

-I (--head)

Sendet eine HEAD-Anfrage, gibt nur die Header aus

Schnelle Header-Prüfung, wenn Sie den Body nicht benötigen

-v (--verbose)

Zeigt vollständige Anfrage und Antwort an, einschließlich TLS-Handshake

Umfassende Fehlerbehebung der gesamten HTTP-Transaktion

-D <file>

Speichert Antwort-Header in einer Datei

Protokolliert Header getrennt vom Hauptteil

-s -o /dev/null -D -

GET-Anfrage, gibt nur Header auf stdout aus

Wenn sich HEAD-Antworten von GET-Antworten unterscheiden

-w '%header{name}'

Extrahiert einen einzelnen Header nach Namen (cURL 7.83+)

Skriptgesteuerte Überprüfung eines bestimmten Headers

-w '%{header_json}'

Gibt alle Header als JSON aus (cURL 7.83+)

Weiterleitung von Headern an jq oder andere JSON-Tools

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/get

Die 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/get

Die 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/get

Hier 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/get

In 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.com

Nach 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.com

Jeder 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- | xargs

Der 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/get

Dies 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/get

Die 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.txt

Geben 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.txt

Binden 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.com

Verwenden 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.com

Um 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.com

Die 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.com

Dies ä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 -i für schnelle visuelle Überprüfungen, bei denen die Antwort-Header inline mit dem Body angezeigt werden, und -I wenn 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 -L mit -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.

Über den Autor
Suciu Dan, Mitbegründer @ WebScrapingAPI
Suciu DanMitbegründer

Suciu Dan ist Mitbegründer von WebScrapingAPI und verfasst praxisorientierte, auf Entwickler zugeschnittene Anleitungen zu den Themen Web-Scraping mit Python, Web-Scraping mit Ruby und Proxy-Infrastruktur.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.