HTTP-MIME-Typ application/xhtml+xml – Info

zur IE-Übersicht

Content-Type-Header

Wenn ein Webserver einem Client (z.B. einem Browser) eine Datei schickt, dann teilt er ihm mit, welchen Typ diese Datei hat. Üblicherweise sind das HTML- oder Bilddateien. Der Server schickt also – vor den eigentlichen Daten – eine Zeile, die etwa so aussieht:

Für den Client ist diese Angabe maßgeblich, nicht die Dateiendung. application/octet-stream steht für einen unbekannten Typ. Das ist dann einfach nur eine Datei, die man speichern kann. Natürlich kann ein Browser nicht alles schon deshalb darstellen, weil er den Dateityp weiß; er muss natürlich auch mit dieser Sorte Datei etwas anfangen können.

application/xhtml+xml

Die neue Generation von HTML, XHTML, ist von XML abgeleitet. Das bedeutet, dass die Codierung wesentlich weniger beliebig ist. Früher konnte (soll heißen: durfte) man <P>ein Absatz<P>noch ein Absatz<P>und noch einer</P> schreiben – es war ja klar, dass neue Absätze anfangen, da konnte der Browser sich das fehlende </P> auch denken...

In XML und damit auch XHTML ist so etwas unzulässig. Da muss jedes Tag geschlossen (und außerdem klein geschrieben) werden: <p>ein Absatz</p><p>noch ein Absatz</p><p>und noch einer</p>. Die HTML-Unsitte, dass der Browser auch kaputte Seiten noch irgendwie darstellt (also rät, was gemeint ist), sollte die XHTML-Welt verschonen. Deshalb haben moderne Browser zwei verschiedene Parser: den alten, fehlertoleranten, und einen XML-Parser. Letzterer bricht bei einem Fehler ab und stellt die Seite nicht dar (sondern nur eine Fehlermeldung). XHTML-Seiten können allerdings mit beiden Parsern verarbeitet werden. Welcher verwendet wird, hängt davon ab, mit welchem Content-Type-Header der Server die Datei schickt. Gibt er als Typ text/html an, wird der alte Parser genutzt, bei application/xhtml+xml dagegen der neue.

Microsoft

Microsoft hat sich auch hier mal wieder für den ganz großen Wurf entschieden, und obwohl der IE schon in Version 6 XHTML-Seiten ja verarbeiten kann, zeigt er bei dem eigentlich passenderen Content-Type keine Webseite an, sondern bietet einem nur die Möglichkeit, die Datei abzuspeichern. Bravo.

Codebeispiel

Da der Inhalt der Datei keine Rolle spielt, nehmen wir eine ganz einfache XHTML-Seite zum Testen. Der Trick liegt darin, mit PHP den Server dazu zu bringen, den Content-Type-Header auszutauschen:

<?php

header("Content-Type: application/xhtml+xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";

?>

Die XML-Zeile muss deshalb mit in den PHP-Code, weil ihre Ende-Sequenz (?>) sonst den PHP-Parser durcheinanderbringt. Der Rest der Datei ist identisch mit der Vergleichsvariante:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>MIME-Test</title>
  <link rel="stylesheet" type="text/css" href="/css/styles.css" />
</head>
<body>
<h1>eine ganz einfache Webseite</h1>
<p>Hallo</p>
</body>
</html>

Benutzer richtiger Browser werden nun langweiligerweise gar keinen Unterschied zwischen den beiden Demo-Varianten feststellen (und Screenshots bringen in diesem Fall wenig). Firefox-Nutzer haben aber die Möglichkeit, sich mittels Live HTTP Headers anzusehen, welchen Content-Type der Server für alles meldet, was der Browser so runterlädt. Den Content-Type der aktuell geladenen Seite kann man sich von vermutlich allen Browsern anzeigen lassen. In Firefox geht das über das Kontextmenü und die Menüleiste (Extras) mit dem Punkt Seiteninformationen anzeigen.

zur Demo (text/html)

zur Demo (application/xhtml+xml)