Spaces. Smartes Cloud Hosting für anspruchsvolle Webprojekte. Loslegen und Spaces testen. Von Mittwald.
Jens Meiert 4. Oktober 2004

XHTML und der richtige MIME-Typ

Kein Beitragsbild

Wer XHTML als Basis für sei­ne Webseiten ver­wen­det, weiß oft nicht, daß der MIME-Typ text/html hier falsch ist. XHTML soll­te als application/xhtml+xml aus­ge­ge­ben wer­den, und über PHP oder Apaches .htac­cess ist dies rasch kon­fi­gu­riert – wobei spe­zi­ell dem Internet Explorer eine Sonderrolle zukommt.

Das W3C defi­niert, dass HTML-Dokumente mit den MIME- (Multi-Purpose Internet Mail Extension) oder Medien-Typ text/html, XHTML-Seiten jedoch als application/xhtml+xml aus­ge­lie­fert wer­den müs­sen, auch wenn prin­zi­pi­ell auch die MIME-Typen application/xml sowie text/xml zuläs­sig sind. Als Ausnahme gilt, dass zumin­dest bei Gebrauch von tran­si­tio­nel­lem XHTML, also dem Doctype XHTML 1.0 Transitional, wei­ter­hin text/html erlaubt, wenn auch eben­falls nicht emp­foh­len ist.

Den MIME-Typ application/xhtml+xml zu ver­wen­den hat aller­dings auch nicht nur den Vorteil, dass man die Standards wirk­lich beher­zigt, son­dern man ist auch grund­sätz­lich Nutznießer zwei­er gro­ßer Vorteile von XHTML, näm­lich Fehlerbehandlung und ech­te Interoperabilität mit ande­ren XML-Derivaten.

Die Umsetzung ist prin­zi­pi­ell schnell erfolgt: In PHP lässt sich der anzu­pas­sen­de HTTP-Header Content-Type durch

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

ändern, und auch über die Konfiguration des Apache-Webservers (in die­sem Artikel wird die Datei .htac­cess als Beispiel ver­wen­det, da vie­le Betroffene bzw. Interessierte nicht unbe­dingt Zugriff auf die httpd.conf haben) wür­de

 AddType application/xhtml+xml .html

bereits genü­gen (für Dateien mit der Erweiterung “.html”) – wenn es nicht User-Agents gäbe, die hier­mit Probleme haben, weil sie den MIME-Typ application/xhtml+xml nicht unter­stüt­zen. Eines der pro­mi­nen­tes­ten Beispiele hier­für ist der Internet Explorer, der den Download-Dialog öff­net, wenn ihm eine application/xhtml+xml-Ressource begeg­net. 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ück­greift:

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

Alternativ, und zudem ele­gan­ter, macht man Gebrauch von der .htac­cess und den Fähigkeiten von Apaches mäch­ti­gem mod_­re­wri­te-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 ange­pass­te Varianten sor­gen dafür, dass nur den User-Agents der “rich­ti­ge” MIME-Typ ser­viert wird, die vor­ge­ben, ihn auch zu akzep­tie­ren: So erhal­ten bei­spiels­wei­se auf Gecko basie­ren­de Browser wie Mozilla oder Firefox das Dokument als application/xhtml+xml (nach­voll­zieh­bar über den Kontextmenüeintrag “Seiteninformationen anzei­gen” bzw. “View Page Info”), wäh­rend dem Internet Explorer das Dokument in ihm zuträg­li­cher Manier als text/html gelie­fert wird.

Auf die genaue Erläuterung jeder Zeile muß an die­ser Stelle im übri­gen ver­zich­tet wer­den, weil hier­zu wei­ter aus­ge­holt wer­den müss­te; eben­so sind selbst­ver­ständ­lich diver­se Modifikationen mög­lich, wie etwa im Falle der .htac­cess bei der Verwendung von Verzeichnis-Indices (Übersicht über alle Dateien in einem Ordner) REQUEST_URI durch REQUEST_FILENAME zu erset­zen, da die­se sonst wei­ter­hin nur als text/html aus­ge­lie­fert wer­den wür­den.

Am Schluss ist noch eine Warnung aus­zu­spre­chen, denn so tri­vi­al die­se wich­ti­ge, stan­dard­kon­for­me Anpassung auch ist – sie kann anfangs zu Problemen füh­ren: CSS-Selektoren sind bei Verwendung mit XML-Dokumenten case-sen­si­tiv, die popu­lä­re Auskommentierung der Inhalte von <script />- und <style />-Elementen muss, wenn die­se bei­be­hal­ten wer­den soll, modi­fi­ziert wer­den, um zu ver­mei­den, dass die Inhalte igno­riert (weil ja wirk­lich kom­men­tiert!) wer­den. Bei aus­gie­bi­gem Gebrauch von Skripten ist dar­auf hin­zu­wei­sen, dass document.write() nicht mehr funk­tio­nie­ren wird. Weitere Informationen hier­zu befin­den sich unter ande­rem in Ian Hicksons legen­dä­rem Artikel Sending XHTML as text/html con­si­de­red harm­ful.

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 benut­ze die­se PHP-Abfrage für mei­ne XHTML-Website und das hat bis­her pro­blem­los funk­tio­niert. Eigentlich tut es das auch jetzt noch. Nur seit kur­zemn wird beim w3c-Validator http://validator.w3.org/ fol­gen­de PHP-Fehlermeldung ange­zeigt:
    Notice: Undefined index: HTTP_ACCEPT in /…der Dateipfad…/Website/Functions/Layout.php on line 7
    Ich habe die PHP-Abfrage zur Übersicht etwas ein­ge­rückt. In der Zeile 7 steht dann fol­gen­der Code:
    if (stristr($_SERVER[“HTTP_ACCEPT”], “application/xhtml+xml”))
    Bei allen Browsern wird die­se Fehlermeldung jedoch nicht ange­zeigt, bzw. es wird gar kein Fehler aus­ge­löst.
    Wo liegt denn nun der Fehler? :)

Schreibe einen Kommentar

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