Aufgrund der real existierenden Browser und ihrer wunderbarenwunderlichen
Umsetzung der Web Standards ist es hin und wieder erforderlich, verschiedenen Browsern
verschiedene Inhalte zu präsentieren. Recht bekannt, und, wie ich finde, nicht die
schlechteste Lösung, sind die sogenannten
Conditional Comments.
Damit kann man syntaktisch valide nestimmte Teile nur bestimmten Internet Explorer Browsern
präsentieren.
Was aber, wenn man es umgekehrt machen will? Also bestimmte Inhalte nicht für den Internet Explorer, sondern nur für andere Browser zur Verfügung stellen? Mit den Conditional Comments geht das nicht. Jedenfalls nicht mit validem HTML. Es gibt eine Methode, die funktioniert, aber nicht valide ist:
<![if lt IE 7]> Anweisungen für IE vor Version 7 und andere Browser <![endif]>
Hier handelt es sich nicht mehr um einen Kommentar, sondern um ein HTML-Tag. Allerdings um ein ungültiges. Der Internet Explorer wertet dies trotzdem aus. Andere Brwoser ignorieren dies und gehen kommentarlos zum Inhalt dieses Tags über. So weit, so gut. Doch leider ist dies eben ein ungültiges HTML-Tag.
Es gibt aber eine andere Methode. Eine zwar recht drastisch, die aber absolut valide ist, und eine sehr gründliche Unterscheidung in Browser und Internet Explorer zulässt. Dazu stellt man zwei verschiedene Versionen der Seite zur Verfügung. Und zwar eine valide XHTML Seite und eine HTML-Seite. Die erstere muss mit dem mime-Typ "application/xhtml+xml" ausgeliefert werden, die zweite wie früher üblich mit "text/html". Der Internet Explorer kann kein XHTML anzeigen. Er bekommt also die HTML-Seite. Firefox, Opera, Safari und wie sie alle heissen, können die XHTML Seite bekommen, in der keine Rücksicht mehr genommen werden muss auf IE "Besonderheiten".
Damit das funktioniert, muss auf ein Feature des Apache Webservers zurückgegriffen werden. Und zwar auf das sogenannte automatic content negotiation. Je nachdem, was der Browser anfordert, bekommt er also automatisch die HTML- oder die XHTML-Version. Der Browser fordert den Typ an mit Hilfe des HTTP Accept Headers. Das geht vollautomatisch, darum braucht man sich nicht zu kümmern. Für den IE steht der Inhalt dieser Variablen in der Registry. Er wird geändert, wenn man in den Browsereinstellungen die bevorzugte Sprache einstellt. Denn mit automatic content negotiation kann man auch zwischen Sprachversionen wählen. Je nachdem, ob man also im IE diese Einstellungen vornimmt oder nicht, wird also solch ein HTTP Accept Header gesendet, oder nicht. Das heisst, dass auf dem Server per Default sicherheitshalber die HTML-Seite ausgeliefert werden muss.
Der Firefox kommt meines Wissens nach automatisch so daher, dass er application/xhtml+xml dem älteren text/html vorzieht. Falls nicht, oder wenn man mal nachprüfen will, geht man auf die Browserinterne Seite about:config und sucht dort nach network.http.accept. Dort steht das drin, was der Browser anfordert. Man kann das auch ändern. Bei mir steht z.B. folgndes drin:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png;q=1.0,*/*;q=0.5
Das bedeutet im Einzelnen folgendes: Mein Browser hätte am liebsten text/xml, application/xml oder application/xhtml+xml. Dabei ist es wurscht, welche der drei Varianten (hmmm, vielleicht sollte ich das noch mal überarbeiten, ich habe auch ein paar xml-Dateien oline). Der Wert, der hinter "q" steht, ist sozusagen ein Gradmesser dafür, wie "beliebt" dieser Typ beim Browser ist. Steht Nichts dabei (wie hier bei den ersten drei Varianten), dann wird q=1.0 angenommen.
Wie man sieht, wird auch text/html akzeptiert, allerdings mit einer etwas niedrigeren Präferenz von 0.9, sowie notfalls auch text/plain mit einer Präferenz von nur noch 0.8. Der Rest ist für Bilder, falls es diese z.B. in verschiedenen Formaten gibt (ja, auch dafür funktioniert das).
Da das meines Wissens nach im Firefox bereits recht vernünftig eingestellt ist, ist das eine prima Browsreweiche. Alte Browser bekommen alten Krempel, moderne Browser bekommen Hack-freies valides XHTML. Und das Beste daran: Man kann die HTML-Version automatisch aus der XHTML-Version per XSL erzeugen lassen. Man muss also nicht zwei Seiten manuell pflegen. Es reicht eine. Die andere kann automatisch erzeugt werden.