HTTP-Header sind die Metadaten, die jede Anfrage und Antwort begleiten: Sie teilen einem Server mit, welcher Client aufruft, welchen Content-Type der Body enthält, welche Credentials zu prüfen sind und welche Sprache oder welches Format Sie erwarten. Wenn Sie HTTP-Header mit cURL senden möchten, reduziert sich die ganze Aufgabe auf ein einziges Flag, aber die Details drumherum (mehrere Header, Standard-Header überschreiben, einen entfernen und die Antwort lesen) sind die Stellen, an denen die meisten Leute hängen bleiben.
Dieser Leitfaden behandelt die praktische Mechanik aus der Perspektive eines erfahrenen Entwicklers. Sie lernen die -H-/--header-Syntax, wie Sie einen oder mehrere Header senden, die Header, die in der echten Arbeit am wichtigsten sind (User-Agent, Accept, Authorization, Cookie und weitere), wie Sie einen Standard-Header überschreiben oder entfernen und wie Sie inspizieren, was der Server zurücksendet. Am Ende verknüpfen wir es mit dem Scraping: Realistische Header lassen eine Anfrage wie einen Browser aussehen, aber sie sind nur die halbe Geschichte, daher zeigen wir, wie Sie cURL über einen Residential-Proxy leiten, wenn Header allein nicht ausreichen.
Das Flag -H: Grundlegende Syntax
cURL sendet einen benutzerdefinierten Header mit dem Flag -H (oder seiner Langform --header), gefolgt vom Header-Namen, einem Doppelpunkt und dem Wert, alles in Anführungszeichen, damit die Shell es als ein Argument behandelt.
curl -H "Header-Name: value" https://example.com
Das ist das vollständige Muster. Die Anführungszeichen sind wichtig: Ein Header-Wert enthält oft Leerzeichen, und ohne Anführungszeichen würde die Shell den Wert in separate Argumente aufteilen und cURL würde ihn ablehnen. Der Header-Name ist laut HTTP-Spezifikation nicht case-sensitiv, aber es ist gute Praxis, ihn in kanonischer Form zu schreiben (User-Agent, nicht user-agent), damit Ihre Befehle klar lesbar sind und mit dem übereinstimmen, was der Server protokolliert.
Wenn Sie die ausführliche Langform bevorzugen, verhält sich --header identisch. Verwenden Sie, was in Skripten besser lesbar ist; die meisten Leute greifen an der Kommandozeile auf -H zurück und schreiben es in festgeschriebenem Code aus.
Einen einzelnen Header senden
Der häufigste einzelne Header ist User-Agent. cURL sendet seinen eigenen Standard-User-Agent (etwa curl/8.4.0), der für jeden Server sofort erkennbar ist, dass Sie kein Browser sind. Ihn zu überschreiben ist ein einziges Flag.
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" https://example.com
Jetzt sieht der Server einen aktuellen Chrome-String statt der cURL-Kennung. Dasselbe Ein-Header-Muster deckt jedes andere Feld ab. Um JSON von einer API anzufordern statt was auch immer der Server standardmäßig liefert, setzen Sie Accept:
curl -H "Accept: application/json" https://api.example.com/data
Mehrere Header senden
Echte Anfragen tragen selten nur einen Header. Um mehrere zu senden, wiederholen Sie -H einmal pro Header. Die Reihenfolge wird beibehalten, und cURL sendet jede Zeile genau so, wie Sie sie schreiben.
curl -H "Accept: application/json" \ -H "Accept-Language: en-US,en;q=0.9" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ https://api.example.com/data
Die Backslashes ermöglichen es, den Befehl über mehrere Zeilen zu verteilen; in einer einzigen Zeile funktioniert es genauso. Es gibt keine praktische Begrenzung für die Anzahl der -H-Flags, die Sie stapeln können, sodass eine Anfrage, die einen Browser-Handshake imitiert, ein Dutzend Header ohne besondere Behandlung tragen kann.
Die wichtigsten Header
Eine Handvoll Header leistet die Hauptarbeit bei API-Arbeit und Scraping. Hier erfahren Sie, wozu jeder dient und wie Sie ihn setzen.
User-Agent
Identifiziert den Client. Setzen Sie einen echten, aktuellen Browser-String, damit der Server die Anfrage wie normalen Traffic behandelt. Veraltete oder offensichtlich synthetische User-Agents sind ein häufiger Blockauslöser, halten Sie Ihren also aktuell.
Accept und Accept-Language
Teilen dem Server mit, welche Content-Types und Sprachen Sie verarbeiten können. Ein Browser sendet diese immer; eine einfache cURL-Anfrage tut das normalerweise nicht, was selbst ein Fingerabdruck ist. Realistische Werte zu senden schließt diese Lücke.
curl -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \ -H "Accept-Language: en-US,en;q=0.9" \ https://example.com
Referer
Gibt an, von welcher Seite Sie auf die angeforderte weitergeleitet wurden. Viele Seiten erwarten bei internen Navigationen einen Same-Origin-Referer und behandeln dessen Fehlen als verdächtig. Ihn auf die eigene Domain der Seite (oder die Seite, von der Sie gekommen wären) zu setzen, macht die Anfrage glaubwürdiger.
curl -H "Referer: https://example.com/" https://example.com/products
Content-Type
Deklariert das Format des von Ihnen gesendeten Bodys. Es gilt nur, wenn Sie einen Request-Body haben, daher sehen Sie es bei POST und PUT, nicht bei einem einfachen GET. Wenn Sie JSON senden, muss der Server wissen, dass er es als JSON parsen soll.
Authorization
Trägt Credentials. Zwei Formen dominieren. Ein Bearer-Token (OAuth, API-Schlüssel) geht direkt in den Header:
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" https://api.example.com/me
Für HTTP-Basic-Auth können Sie den Header manuell aufbauen, aber cURL hat eine Abkürzung. Das Flag -u base64-kodiert user:pass in einen Authorization: Basic-Header für Sie, was weniger fehleranfällig ist als die eigene Kodierung.
# cURL builds the Basic header for you curl -u myuser:mypassword https://api.example.com/secure # Equivalent, written out by hand curl -H "Authorization: Basic bXl1c2VyOm15cGFzc3dvcmQ=" https://api.example.com/secure
Cookie
Sendet gespeicherten Session-Zustand. Sie können einen Cookie inline mit -H für eine einmalige Anfrage übergeben, oder das cURL-Flag -b verwenden, das auch eine von einem früheren -c-Aufruf erstellte Cookie-Datei akzeptiert, sodass eine Session über mehrere Anfragen hinweg bestehen bleibt.
curl -H "Cookie: session_id=abc123; theme=dark" https://example.com/account
HTTP behandelt Header-Namen case-insensitiv, also erreichen User-Agent und user-agent dasselbe Feld. Werte hingegen werden unverändert übertragen. Ein Tippfehler in einem Token oder ein unerwünschtes Leerzeichen in einem User-Agent wird unverändert durchgeleitet, also prüfen Sie bei seltsam verhaltendem Anfragen den Wert Byte für Byte, bevor Sie den Server beschuldigen.
Einen Header überschreiben versus hinzufügen
cURL sendet einige Header automatisch: Host, User-Agent und Accept darunter. Wenn Sie ein -H für einen Header übergeben, den cURL bereits sendet, ersetzt Ihr Wert den Standard, anstatt eine zweite Kopie anzuhängen. Deshalb tauscht -H "User-Agent: ..." den cURL-String sauber aus, anstatt zwei User-Agent-Zeilen zu erzeugen.
Für einen Header, den cURL nicht standardmäßig sendet, fügt Ihr -H ihn einfach hinzu. Das mentale Modell ist also unkompliziert: Wenn es ein Standard-Header ist, überschreiben Sie ihn, sonst fügen Sie ihn hinzu. In beiden Fällen ist die Syntax dasselbe einzelne Flag.
Einen Standard-Header entfernen
Manchmal möchten Sie einen Header ganz entfernen, nicht ersetzen. Um einen Standard-Header zu entfernen, übergeben Sie seinen Namen gefolgt von einem Doppelpunkt und nichts dahinter. cURL liest den leeren Wert als Signal, den Header aus der Anfrage wegzulassen.
# Remove the Accept header entirely curl -H "Accept:" https://example.com # Override one default and remove another in the same request curl -H "User-Agent: Mozilla/5.0" -H "Accept:" https://example.com
Beachten Sie den Unterschied: "Accept: value" setzt den Header, "Accept:" ohne Wert entfernt ihn, und ein abschließendes Semikolon ("Accept;") sendet den Header mit einem leeren Wert, was ein dritter, seltenerer Fall ist. Meistens möchten Sie das erste oder zweite.
Antwort-Header anzeigen
Header zu senden ist die eine Hälfte der Kommunikation; zu lesen, was zurückkommt, ist die andere. cURL gibt Ihnen drei Optionen, je nachdem, ob Sie auch den Body möchten.
Verwenden Sie -I (oder --head), um nur die Antwort-Header mit einer HEAD-Anfrage abzurufen, ohne Body-Download:
curl -I https://example.com
Verwenden Sie -i (oder --include), um die Header gefolgt vom vollständigen Body auszugeben, was praktisch ist, wenn Sie beides gleichzeitig möchten:
curl -i https://example.com
Verwenden Sie -D (oder --dump-header), um die Antwort-Header in eine Datei zu schreiben, während der Body zur Standardausgabe geht. Übergeben Sie -D -, um Header zusammen mit dem Body zur Standardausgabe zu schreiben, was nützlich ist, wenn Sie sie in einem Protokoll behalten möchten.
# Save response headers to a file, body to stdout curl -D headers.txt https://example.com
Ein typischer Antwort-Header-Block sieht so aus und teilt Ihnen Status, Content-Type und Caching-Richtlinie auf einen Blick mit:
HTTP/2 200 content-type: text/html; charset=UTF-8 cache-control: max-age=3600 server: nginx
Benutzerdefinierte Header bei einem POST senden
Header kommen bei Schreibanfragen besonders zum Tragen. Ein typischer JSON-POST an eine API benötigt mindestens einen Content-Type, damit der Server den Body korrekt parst, und normalerweise auch einen Authorization-Header. Das Flag -d liefert den Body, und cURL wechselt automatisch zu POST, wenn es einen sieht.
curl -X POST https://api.example.com/items \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -d '{"name": "widget", "qty": 12}'
Das -X POST ist technisch redundant, sobald Sie -d übergeben, aber es ausszuschreiben macht die Absicht in einem Skript offensichtlich. Wenn der Server Formulardaten statt JSON erwartet, ändern Sie Content-Type in application/x-www-form-urlencoded und übergeben Sie die Felder auf dieselbe Weise.
Wenn Sie von den Anfrage-Grundlagen aufbauen, behandelt unsere Anleitung zu wie man GET-Anfragen mit cURL sendet die Leseseite desselben Werkzeugkastens.
Header und Web-Scraping: Was sie können und was nicht
Hier trifft Header-Wissen auf die Realität. Eine Anfrage von einer Standard-cURL-Installation ist trivial von einem Browser zu unterscheiden: Sie sendet den curl/x.y.z-User-Agent, lässt Accept-Language weg, trägt keinen Referer und bringt keine der Client-Hints mit, die ein echter Browser enthält. Server mit auch nur grundlegendem Schutz erkennen genau diese Lücken.
Realistische Header schließen die einfachen Lücken. Ein aktueller Chrome-User-Agent, ein plausibler Accept- und Accept-Language- und ein Same-Origin-Referer zusammen lassen Ihre Anfrage weit mehr wie normalen Browser-Traffic aussehen. Für leicht geschützte Seiten reicht das allein oft aus, um nicht abgewiesen zu werden. Unser Leitfaden zu cURL für Web-Scraping geht tiefer auf die Zusammenstellung eines glaubwürdigen Header-Sets ein.
Aber Header haben eine harte Grenze. Sie beschreiben die Anfrage; sie sagen nichts darüber aus, woher sie kommt. Anti-Bot-Systeme berücksichtigen auch IP-Reputation, Anfragerate, TLS-Fingerabdrücke und Verhaltens-Signale. Wenn Sie hundert Anfragen pro Minute von einer einzelnen Datacenter-IP senden, rettet Sie kein Header-Set: Die Adresse selbst ist der Verräter. Realistische Header reduzieren triviale Sperren, aber allein schlagen sie keine ernsthaften Anti-Bot-Abwehrmechanismen oder schlechte IP-Reputation.
cURL durch einen Residential-Proxy leiten
Die fehlende Hälfte ist die IP. Wenn Sie cURL durch einen Pool rotierender Residential-Adressen leiten, kommen Ihre Anfragen von IPs, die wie echte Nutzer wirken, während Sie volle Kontrolle über jeden Header behalten. cURL kommuniziert nativ mit Proxys über das Flag -x (oder --proxy), also ist das Hinzufügen eines Proxys ein einziges Argument zusätzlich zu den bereits gesendeten Headern.
Der Smart AI Proxy (auch AI Proxy genannt) stellt Residential-Rotation als einzelnen Drop-in-Endpunkt bereit. Sie richten cURL mit -x darauf, authentifizieren sich mit Ihrem Token und senden beliebige Header; der Proxy rotiert die Exit-IP im Hintergrund.
curl -x "http://[email protected]:8012" \ -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" \ -H "Accept-Language: en-US,en;q=0.9" \ -k https://example.com
Das Flag -x setzt den Proxy, die -H-Flags tragen Ihre realistischen Header genau wie zuvor, und die Anfrage verlässt von einer vertrauenswürdigen Residential-IP. Sie behalten die volle Header-Kontrolle, die cURL Ihnen gibt, und gewinnen die IP-Reputation, die Header allein nicht liefern können. Die allgemeine Mechanik des Proxying von cURL-Anfragen finden Sie unter wie man cURL mit einem Proxy verwendet.
Schreiben Sie weiterhin Ihre eigenen Header in cURL und lassen Sie das IP-Problem sich von selbst lösen. Der Smart AI Proxy rotiert Residential-Adressen hinter einem Endpunkt, sodass Ihr sorgfältig gestalteter User-Agent, Accept-Language und Referer von einer IP abgehen, der Server vertrauen. Richten Sie cURL mit einem einzigen -x-Flag darauf und behalten Sie die volle Kontrolle über jeden Header.
Wenn Sie den Unterschied zwischen einem Forward-Proxy wie diesem und dem Reverse-Proxy vor einem Server verstehen möchten, zieht unser Erklärungsartikel zu Forward- vs. Reverse-Proxys die Linie klar.
Header-Probleme debuggen
Wenn sich eine Anfrage unerwartet verhält, ist das schnellste Werkzeug -v (verbose), das die Request-Header ausgibt, die cURL tatsächlich gesendet hat (mit > vorangestellt), und die Response-Header, die es empfangen hat (mit < vorangestellt). Es zeigt genau, was über die Leitung gegangen ist, was normalerweise ausreicht, um einen fehlenden Header oder Tippfehler zu finden.
curl -v -H "Authorization: Bearer YOUR_ACCESS_TOKEN" https://api.example.com/me
Drei Probleme machen die meisten Header-Fehler aus. Erstens fehlende Anführungszeichen: Ein Wert mit einem Leerzeichen teilt sich in zusätzliche Shell-Argumente und cURL gibt einen Fehler aus, also setzen Sie den gesamten name: value-String immer in Anführungszeichen. Zweitens ein unbeabsichtigtes Überschreiben: Das Übergeben von -H "User-Agent: ..." ersetzt den Standard, anstatt ihn hinzuzufügen, was Sie für User-Agent wollen, aber eine Überraschung ist, wenn Sie beide erwartet haben. Drittens versehentliches Entfernen: Ein unerwünschtes "Header:" ohne Wert entfernt den Header vollständig. Führen Sie mit -v aus und die Wahrheit liegt in der Anfragezeile.
Wichtigste Erkenntnisse
-
Ein Flag erledigt alles.
-H "Name: value"sendet jeden Header; wiederholen Sie-Hfür so viele Header wie nötig, und die Reihenfolge bleibt erhalten. -
Überschreiben, hinzufügen oder entfernen. Ein
-Hfür einen Standard-Header ersetzt ihn, ein-Hfür einen neuen fügt ihn hinzu, und"Header:"ohne Wert entfernt ihn. -
Auch die Antwort lesen.
-Iruft nur Header ab,-istellt sie dem Body voran, und-Dschreibt sie in eine Datei oder die Standardausgabe. - Realistische Header reduzieren triviale Sperren. Ein echter User-Agent, Accept-Language und Referer lassen eine Anfrage wie einen Browser aussehen, schlagen aber keine ernsthaften Anti-Bot-Abwehrmechanismen.
-
Header mit einer vertrauenswürdigen IP kombinieren. Leiten Sie cURL über den Smart AI Proxy mit
-x, damit Anfragen von rotierenden Residential-Adressen abgehen, während Sie volle Header-Kontrolle behalten.
Häufig gestellte Fragen
Wie füge ich einen benutzerdefinierten HTTP-Header in cURL hinzu?
Verwenden Sie das Flag -H (oder seine Langform --header) gefolgt vom Header-Namen, einem Doppelpunkt und dem Wert, alles in Anführungszeichen: curl -H "Header-Name: value" https://example.com. Die Anführungszeichen verhindern, dass die Shell einen Wert, der Leerzeichen enthält, in separate Argumente aufteilt.
Wie sende ich mehrere Header in einer cURL-Anfrage?
Wiederholen Sie das Flag -H einmal pro Header. Zum Beispiel sendet curl -H "Accept: application/json" -H "Authorization: Bearer TOKEN" https://api.example.com beide. Es gibt keine praktische Begrenzung, und cURL bewahrt die Reihenfolge, in der Sie sie schreiben.
Wie setze ich ein Bearer-Token oder Basic-Auth mit cURL?
Für ein Bearer-Token übergeben Sie es direkt: -H "Authorization: Bearer YOUR_TOKEN". Für HTTP-Basic-Auth ist das Flag -u user:pass einfacher als das manuelle Aufbauen des Headers, weil cURL die Credentials base64-kodiert und den Header Authorization: Basic für Sie setzt.
Wie zeige ich mit cURL nur die Antwort-Header an?
Verwenden Sie -I (oder --head), um nur die Header mit einer HEAD-Anfrage abzurufen und den Body zu überspringen. Wenn Sie Header und Body zusammen möchten, verwenden Sie -i (oder --include). Um die Header in eine Datei zu speichern, verwenden Sie -D filename.
Wie entferne ich einen Standard-Header, den cURL sendet?
Übergeben Sie den Header-Namen mit einem Doppelpunkt und ohne Wert: curl -H "Accept:" https://example.com entfernt den Accept-Header vollständig. Das unterscheidet sich von "Accept: value", das ihn setzt, und "Accept;", das ihn mit einem leeren Wert sendet.
Verhindern benutzerdefinierte Header, dass mein Scraper gesperrt wird?
Realistische Header helfen bei leicht geschützten Seiten, indem sie Ihre Anfrage wie einen Browser aussehen lassen, aber sie können keine ernsthaften Anti-Bot-Systeme oder schlechte IP-Reputation allein schlagen. Header beschreiben die Anfrage, nicht woher sie kommt. Kombinieren Sie sie mit rotierenden Residential-IPs, zum Beispiel indem Sie cURL über den Smart AI Proxy mit dem Flag -x leiten, damit Ihr Traffic von vertrauenswürdigen Adressen abgeht, während Sie volle Header-Kontrolle behalten.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
