XHTML und der richtige MIME-Typ

Artikel vom 4. Oktober 2004 (↻ 5. April 2006), exklusiv für Dr. Web. ISSN 1614-3124, #8. Schwerpunkt:  (RSS-Feed).

Wer XHTML als Basis für seine Webseiten verwendet, weiß oft nicht, dass der MIME-Typ text/html hier falsch ist. XHTML sollte als application/xhtml+xml ausgegeben werden, und über PHP oder Apaches .htaccess ist dies rasch konfiguriert – nur dem Internet Explorer kommt eine Sonderrolle zu.

Standardkonform vorgehen

Das W3C definiert, dass HTML-Dokumente mit den MIME- (Multi-Purpose Internet Mail Extension) oder Medientyp text/html, XHTML-Seiten jedoch als application/xhtml+xml ausgeliefert werden sollten, auch wenn prinzipiell auch die MIME-Typen application/xml sowie text/xml zulässig sind. Eine Ausnahme ist, dass zumindest bei Gebrauch von transitionellem XHTML, also dem Dokumenttyp XHTML 1.0 Transitional, text/html weiterhin erlaubt, wenn auch nicht empfohlen wird.

Nach ehemaliger Korrespondenz mit Anne van Kesteren und auf späteren Hinweis von Markus Stange muss ich das korrigieren – XHTML 1.0 »kann ruhig« in allen Ausprägungen als text/html ausgegeben werden.

Den MIME-Typ application/xhtml+xml zu verwenden hat allerdings auch nicht nur den Vorteil, dass man die Standards beherzigt, sondern man ist grundsätzlich auch Nutznießer zweier großer Vorteile von XHTML, nämlich Fehlerbehandlung und echte Interoperabilität mit anderen XML-Derivaten.

Die Umsetzung ist prinzipiell einfach: In PHP lässt sich der anzupassende HTTP-Header Content-Type durch

<?php header("Content-type: application/xhtml+xml"); ?>

ändern, und auch über die Konfiguration des Apache-Webservers (in diesem Artikel wird die Datei .htaccess als Beispiel verwendet, da viele Betroffene bzw. Interessierte nicht unbedingt Zugriff auf die Datei httpd.conf haben) würde

AddType application/xhtml+xml .html

bereits genügen (für Dateien mit der Erweiterung ».html«) – wenn es nicht User-Agents gäbe, die hiermit Probleme haben, weil sie den MIME-Typ application/xhtml+xml nicht unterstützen. Eines der prominentesten Beispiele hierfür ist der Internet Explorer, der den Download-Dialog öffnet, wenn ihm eine application/xhtml+xml-Ressource begegnet. Glücklicherweise lässt sich dieses Dilemma mit ein paar Handgriffen lösen, indem man zum Beispiel auf die Möglichkeiten von PHP zurückgreift (siehe auch Michael Jendryschiks modifizierte Variante):

<?php
if ( stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ) {
  header("Content-type: application/xhtml+xml");
} else {
  header("Content-type: text/html");
}
?>

Alternativ macht man Gebrauch von der .htaccess und den Fähigkeiten von Apaches mächtigem mod_rewrite-Modul:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml\s*;\s*q=0
RewriteCond %{REQUEST_URI} \.html$
RewriteCond %{THE_REQUEST} HTTP/1\.1
RewriteRule .* - [T=application/xhtml+xml]

Beide Varianten sorgen dafür, dass nur den User-Agents der »richtige« MIME-Typ serviert wird, die vorgeben, ihn auch zu akzeptieren: So erhalten zum Beispiel auf der Gecko-Engine basierende Browser wie Firefox das Dokument als application/xhtml+xml (nachvollziehbar zum Beispiel über den Kontextmenüeintrag »Seiteninformationen anzeigen« bzw. »View Page Info«), während dem Internet Explorer das Dokument in ihm zuträglicher Manier als text/html geliefert wird.

Auf die genaue Erläuterung jeder Zeile wird an dieser Stelle verzichtet, weil hierzu weiter ausgeholt werden müsste; ebenso sind selbstverständlich diverse Modifikationen möglich, wie zum Beispiel im Falle der .htaccess bei Verwendung von Verzeichnis-Indices (zur Übersicht über alle Dateien in einem Ordner) REQUEST_URI durch REQUEST_FILENAME zu ersetzen, da diese sonst weiterhin nur als text/html ausgeliefert werden würden.

Am Schluss ist noch eine Warnung loszuwerden, weil dieser Artikel bzw. sein Autor keine Hilfestellung bei Problemen gibt und geben kann; so trivial diese wichtige, standardkonforme Anpassung auch ist, kann sie anfangs zu Problemen führen: CSS-Selektoren sind bei Verwendung mit XML-Dokumenten case-sensitive, die populäre Auskommentierung der Inhalte von script- und style-Elementen muss, wenn diese beibehalten werden soll, modifiziert werden, um zu vermeiden, dass die Inhalte ignoriert (weil ja kommentiert) werden, und bei ausgiebigem Gebrauch von Skripten ist darauf hinzuweisen, dass document.write() nicht mehr funktionieren wird. Hierzu bietet Ian Hicksons Artikel Sending XHTML as text/html Considered Harmful detailliertere Informationen.

Nachtrag (11. Februar 2006)

Via Roger Johansson: Um dem W3C-Validierer ebenfalls application/xhtml+xml vorzusetzen, kann die zweite Zeile der obenstehenden PHP-Abfrage durch die folgende ersetzt werden:

if ( stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ||
  stristr($_SERVER["HTTP_USER_AGENT"],"W3C_Validator")) {

Dazu kann es laut Dirk Taggesell unter bestimmten Umständen zu Problemen mit Proxies kommen. Bei einer Anfrage nach einem Dokument, das als application/xhtml+xml ausgeliefert wird, könnte der Proxy auch alle weiteren Dokumente mit diesem MIME-Typ ausliefern. Sollte also eine weitere Anfrage von einem User-Agent erfolgen, der application/xhtml+xml nicht unterstützt, wäre dies problematisch. Persönlich konnte ich dieses Problem bislang jedoch nicht reproduzieren oder andersartig bestätigen.

HierĂĽber tooten?

Ăśber mich

Jens Oliver Meiert, am 30. September 2021.

Ich bin Jens, und ich bin ein Engineering Lead und Autor. Ich habe als technischer Leiter für Firmen wie Google gearbeitet, bin W3C und WHATWG verbunden und schreibe und prüfe Bücher für O’Reilly und Frontend Dogma. Ich experimentiere gerne, nicht nur in der Webentwicklung, sondern auch in anderen Bereichen wie der Philosophie. Hier auf meiert.com teile ich einige meiner Ansichten und Erfahrungen.

Wenn du eine Frage oder Anregung zu dem hast, was ich schreibe, sende bitte jederzeit eine Nachricht. Danke!