Jens Oliver Meiert

XHTML und der richtige MIME-Typ

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

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 wirklich 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 beziehungsweise 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« beziehungsweise »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 beziehungsweise 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 wirklich 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.

Über den Autor

Jens Oliver Meiert, Foto vom 27. Juli 2015.

Jens Oliver Meiert ist ein deutscher Philosoph und Entwickler (Google, W3C, O’Reilly). Er experimentiert mit Kunst und Abenteuer. Hier auf meiert.com teilt und verallgemeinert und übertreibt er einige seiner Gedanken und Erfahrungen.

Mehr Jens gibt es im Archiv und bei Amazon. Wenn Sie eine Frage oder ein Anliegen (oder eine Empfehlung) zu dem haben, was er schreibt, senden Sie gerne jederzeit eine Nachricht.

Ähnliche Themen

Das könnte Sie ebenfalls interessieren:

Schwerpunkt:

Oder vielleicht auf Google+, Twitter oder XING hallo sagen?

Fehler entdeckt? Belohnung! E-Mail an jens@meiert.com.

Sie sind hier: StartseitePublikationen → XHTML und der richtige MIME-Typ

Stand: 5. April 2006.

»Sei fair, sei fleißig, sei nüchtern und sei glücklich