Anzeige
Smartes Cloud Hosting für anspruchsvolle Projekte.
↬ Loslegen und Spaces testen ↬ Jetzt testen!
Jens Meiert 4. Oktober 2004

XHTML und der richtige MIME-Typ

Kein Beitragsbild

Wer XHTML als Basis für seine Webseiten verwendet, weiß oft nicht, daß 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 – wobei speziell dem Internet Explorer eine Sonderrolle zukommt.

Das W3C definiert, dass HTML-Dokumente mit den MIME– (Multi-Purpose Internet Mail Extension) oder Medien-Typ text/html, XHTML-Seiten jedoch als application/xhtml+xml ausgeliefert werden müssen, auch wenn prinzipiell auch die MIME-Typen application/xml sowie text/xml zulässig sind. Als Ausnahme gilt, dass zumindest bei Gebrauch von transitionellem XHTML, also dem Doctype XHTML 1.0 Transitional, weiterhin text/html erlaubt, wenn auch ebenfalls nicht empfohlen ist.

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

Anzeige

Die Umsetzung ist prinzipiell schnell erfolgt: 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 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 das Dilemma aber mit ein paar Handgriffen lösen, indem man zum Beispiel auf die Möglichkeiten von PHP zurückgreift:

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

Alternativ, und zudem eleganter, 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 nun angepasste Varianten sorgen dafür, dass nur den User-Agents der „richtige“ MIME-Typ serviert wird, die vorgeben, ihn auch zu akzeptieren: So erhalten beispielsweise auf Gecko basierende Browser wie Mozilla oder Firefox das Dokument als application/xhtml+xml (nachvollziehbar ü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 muß an dieser Stelle im übrigen verzichtet werden, weil hierzu weiter ausgeholt werden müsste; ebenso sind selbstverständlich diverse Modifikationen möglich, wie etwa im Falle der .htaccess bei der Verwendung von Verzeichnis-Indices (Ü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 auszusprechen, denn so trivial diese wichtige, standardkonforme Anpassung auch ist – sie kann anfangs zu Problemen führen: CSS-Selektoren sind bei Verwendung mit XML-Dokumenten case-sensitiv, 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. Bei ausgiebigem Gebrauch von Skripten ist darauf hinzuweisen, dass document.write() nicht mehr funktionieren wird. Weitere Informationen hierzu befinden sich unter anderem in Ian Hicksons legendärem Artikel Sending XHTML as text/html considered harmful.

Jens Meiert

Jens O. Meiert, Webentwickler und Informationsdesigner (Google, W3C) und Autor (O’Reilly), ist spezialisiert auf professionelles Webdesign, Webentwicklung, Barrierefreiheit und Usability.

Ein Kommentar

  1. Ich benutze diese PHP-Abfrage für meine XHTML-Website und das hat bisher problemlos funktioniert. Eigentlich tut es das auch jetzt noch. Nur seit kurzemn wird beim w3c-Validator http://validator.w3.org/ folgende PHP-Fehlermeldung angezeigt:
    Notice: Undefined index: HTTP_ACCEPT in /…der Dateipfad…/Website/Functions/Layout.php on line 7
    Ich habe die PHP-Abfrage zur Übersicht etwas eingerückt. In der Zeile 7 steht dann folgender Code:
    if (stristr($_SERVER[„HTTP_ACCEPT“], „application/xhtml+xml“))
    Bei allen Browsern wird diese Fehlermeldung jedoch nicht angezeigt, bzw. es wird gar kein Fehler ausgelöst.
    Wo liegt denn nun der Fehler? :)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.