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:
| Dateityp | Passender MIME-Type |
|---|---|
| HTML-Dokumente | text/html |
| CSS-Stylesheets | text/css |
| JavaScript-Dateien | text/javascript |
| JSON-Daten (APIs) | application/json |
| PDF-Dokumente | application/pdf |
| Bilder (Modern) | image/webp, image/avif |
| PNG / JPEG | image/png, image/jpeg |
| Schriftarten | font/woff2 |
| XML-Daten | application/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-Type | Anwendungsfall | Format des Körpers |
|---|---|---|
application/json | REST-APIs, moderne Webanwendungen | JSON-Objekt |
application/x-www-form-urlencoded | Klassische HTML-Formulare | feld1=wert1&feld2=wert2 |
multipart/form-data | Datei-Uploads | Mehrteiliger Block mit Grenzmarken |
text/plain | Einfacher Text, Debugging | Roher 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-Typedeklarierten 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).