HTTP Header

Content-Type im HTTP verständlich erklärt: MIME-Typen und Zeichensätze

Der HTTP-Header Content-Type ist eine der grundlegendsten Anweisungen bei der Client-Server-Kommunikation. Er teilt dem Webbrowser mit, um welche Art von Daten es sich bei der gelieferten Antwort handelt (z. B. eine HTML-Seite, ein JPEG-Bild oder eine JSON-API-Antwort) und wie diese codiert sind. Auf Basis dieses Headers entscheidet der Browser, ob er die Datei rendert, ein Skript ausführt oder einen Dateidownload startet.

Der Content-Type ist sowohl ein Request- als auch ein Response-Header und arbeitet eng mit dem Sicherheits-Header X-Content-Type-Options sowie der Inhaltsaushandlung über Accept-Encoding zusammen. Ein falsch gesetzter Content-Type ist eine der häufigsten Ursachen für nicht funktionierende Webseiten und APIs.

Aufbau und Syntax des Content-Type Headers

Der Content-Type-Header besteht in der Regel aus dem MIME-Typ der Ressource und optional einer Anweisung zur Zeichencodierung (Charset):

Content-Type: text/html; charset=utf-8
Content-Type: application/json; charset=utf-8
Content-Type: image/webp
  • Hauptkategorie (z. B. text, image, application): Definiert die grobe Art der Datei.
  • Unterkategorie (z. B. html, webp, json): Präzisiert das Dateiformat.
  • Charset (z. B. charset=utf-8): Definiert den Zeichensatz. UTF-8 ist der moderne B2B-Standard, da er fast alle Schriftsysteme und Sonderzeichen weltweit abdeckt.

Die wichtigsten MIME-Typen im Web

Im Weballtag begegnen Entwicklern vor allem folgende MIME-Typen:

DateitypPassender MIME-Type
HTML-Dokumentetext/html
CSS-Stylesheetstext/css
JavaScript-Dateientext/javascript
JSON-Daten (APIs)application/json
PDF-Dokumenteapplication/pdf
Bilder (Modern)image/webp, image/avif
PNG / JPEGimage/png, image/jpeg
Schriftartenfont/woff2
XML-Datenapplication/xml

Content-Type bei Requests: Daten an den Server senden

Nicht nur Server liefern einen Content-Type – auch der Client deklariert beim Senden von Daten (POST, PUT), in welchem Format der Nachrichtenkörper vorliegt. Die Wahl entscheidet, wie der Server die Anfrage interpretiert:

Content-TypeAnwendungsfallFormat des Körpers
application/jsonREST-APIs, moderne WebanwendungenJSON-Objekt
application/x-www-form-urlencodedKlassische HTML-Formularefeld1=wert1&feld2=wert2
multipart/form-dataDatei-UploadsMehrteiliger Block mit Grenzmarken
text/plainEinfacher Text, DebuggingRoher Text

Schickt ein Client JSON, deklariert aber application/x-www-form-urlencoded, kann der Server die Daten nicht parsen und antwortet typischerweise mit 400 Bad Request oder 415 Unsupported Media Type.


Praxisbeispiel: vollständige API-Antwort

So sieht eine korrekte JSON-Antwort einer API auf der Leitung aus – der Content-Type steht im Kopf, der passende Körper folgt:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 51
Cache-Control: no-cache

{ "status": "ok", "name": "Müller", "city": "Zürich" }

Dank charset=utf-8 werden die Umlaute in «Müller» und «Zürich» korrekt dargestellt. Fehlt diese Angabe, interpretieren manche Clients die Bytes als Latin-1 und zeigen Zeichensalat. Wie der zugehörige Cache-Control-Header das Caching steuert, ist im jeweiligen Artikel beschrieben.


Sicherheitsaspekte: MIME-Sniffing und nosniff

Wenn der Server eine Datei ausliefert, den Content-Type-Header jedoch falsch setzt oder weglässt, versuchen ältere und manche moderne Browser, das Dateiformat anhand des Inhalts zu erraten. Dieses Verhalten wird als MIME-Sniffing bezeichnet.

MIME-Sniffing birgt erhebliche Sicherheitsrisiken:

  • Ein Angreifer lädt in einem Forum eine harmlose Textdatei (.txt) hoch, die jedoch versteckten HTML- und JavaScript-Code enthält.
  • Der Server liefert diese Datei aus. Durch MIME-Sniffing erkennt der Browser das JavaScript und führt es im Sicherheitskontext der Website aus (Cross-Site Scripting - XSS).
  • Schutzmassnahme: Um dieses Erraten des Dateityps strikt zu unterbinden, müssen Webserver den Sicherheits-Header X-Content-Type-Options: nosniff mitsenden. Der Browser wird dadurch gezwungen, sich exakt an den im Content-Type deklarierten Typen zu halten.

[!TIP] Ein falsch gesetzter Content-Type führt dazu, dass Browser CSS-Dateien ignorieren oder JSON-Antworten als Download anbieten, statt sie im Frontend zu verarbeiten. Validieren Sie die MIME-Typen Ihrer Website live mit dem HTTP Header Check auf balou.tools.

Häufig gestellte Fragen (FAQ)

Was ist ein MIME-Type?

MIME steht für Multipurpose Internet Mail Extensions. Es ist ein standardisiertes Format (bestehend aus Hauptkategorie und Unterkategorie, z. B. `text/html`), um den Typ einer Datei im Internet eindeutig zu identifizieren.

Warum ist die Angabe des Charsets (Zeichensatz) wichtig?

Ohne die Angabe des Zeichensatzes (z. B. `charset=utf-8`) kann der Browser Sonderzeichen, Umlaute (ä, ö, ü) oder Emojis nicht korrekt darstellen, was zu Fehldarstellungen (Zeichensalat) führt.

Was ist der Unterschied zwischen Content-Type und Accept?

Der `Content-Type`-Header beschreibt das Format der tatsächlich übermittelten Daten im Nachrichtenkörper (Request oder Response). Der `Accept`-Header dagegen ist ein Request-Header, mit dem der Client dem Server mitteilt, welche Formate er verarbeiten kann – der Server wählt daraus per Content Negotiation das passende aus und deklariert es dann via `Content-Type`.

Welcher Content-Type gilt für das Hochladen von Dateien per Formular?

Für Datei-Uploads aus HTML-Formularen wird `multipart/form-data` verwendet. Reine Textformulare nutzen `application/x-www-form-urlencoded`, während moderne APIs typischerweise `application/json` erwarten. Stimmt der gesendete Content-Type nicht mit dem überein, was der Server erwartet, antwortet dieser meist mit dem Statuscode 415 (Unsupported Media Type).