Le type MIME est utilisé par plusieurs protocoles sur internet pour indiquer le type exact d’un document, notamment le protocole HTTP. Le type MIME est une chaîne de caractères qui indique le type principal et le sous-type logique d’un document, séparés par un slash (/). Ce type permet de savoir comment le navigateur devra interpréter le document.

Le type MIME que le W3C préconise d’utiliser est application/xhtml+xml, d’après le XHTML Media-types W3C Note. Mais, ce n’est pas si simple dans la pratique (ça ne l’est jamais !).

Pourquoi pas text/html ?

text/html est le type MIME historique des fichiers HTML. Avec XHTML, on utilise un nouveau type, pour la simple raison que XHTML est un langage basé sur XML, ce qui signifie que le le document est sujet à des règles strictes pour être valide et n’est pas la soupe servie sur beaucoup de pages. C’est pourquoi il est intéressant d’indiquer au navigateur la différence entre la soupe et le plat du chef ! De plus, il existe certaines différences de syntaxe entre HTML et XHTML, notamment au niveau des balises indépendantes (comme <br/>).

Mais il y a un os : le nouveau type MIME n’est pas connu des vieux navigateurs…

Et on fait quoi maintenant ?

Le problème se pose notamment avec les versions d’Internet Explorer (de Microsoft) jusqu’à la version 6. Pour éviter les troubles liés à la compatibilité ascendante, XHTML 1.0 admet un mode de compatibilité (backward compatibility mode) qui indique comment rendre ses pages XHTML compatibles avec les vieux navigateurs : vous pouvez donc utiliser le type MIME text/html et quelques astuces syntaxiques pour que vos pages soient lisibles sur les vieux bidules…

Cette technique vous garantira la compatibilité ascendante, mais vous perdrez alors les avantages qu’offre le nouveau type MIME : c’est à dire la capacité de traiter le document comme un document XML, qui permet d’éviter aux navigateurs récents de devoir analyser la page en tenant compte de certaines erreurs du passé, et donc d’afficher plus rapidement la page.

Le W3C propose également de tester sur le serveur si le navigateur supporte ce type MIME et de renvoyer celui qui conviendra (content negotiation).

Ceci peut se faire avec PHP, par exemple :

  1. <?php
  2. if(!empty($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml') !== false)
  3. header('Content-Type: application/xhtml+xml');
  4. else
  5. header('Content-Type: text/html; charset=UTF-8');
  6.  
  7. if ($accept_xml) {
  8. echo '<?xml version="1.0" encoding="UTF-8"? >'."\n";
  9. }
  10. ?>

Cette seconde solution est un peu plus technique, et devient difficile à mettre en place dans certaines situations, mais est conseillée si vous en avez la possibilité…

Vous pouvez également transmettre vos pages XHTML avec le type MIME application/xml, ou encore text/xml. Cependant, en utilisant le type text/xml vous risquez d’avoir des problèmes d’encodage de caractères, car les règles à suivre avec les types text/* sont plus complexes que celle à suivre avec application/*. Par ailleurs, avec ces deux types MIME, Internet Explorer affichera la source au lieu d’interpréter la page…

Version Type MIME recommandé Limitations Types alternatifs supportés Techniques
HTML 2.0,3.2,4.0,4.01 text/html Aucune, mais l’utilisation de ce type MIME cache souvent un code de mauvaise qualité
N/A N/A
XHTML 1.0 application/xhtml+xml N’est pas reconnu par Internet Explorer 6.x et précédents
D’après les règles de compatibilité, vous pouvez utiliser text/html
application/xml (ou text/xml, mais en étant vigilant aux problèmes d’encodages de caractères)
backward compatibility guidelines
content negotiation entre text/html et application/xhtml+xml
XHTML 1.1
application/xhtml+xml N’est pas reconnu par Internet Explorer 6.x et précédents application/xml (ou text/xml, mais en étant vigilant aux problèmes d’encodages de caractères)
N/A

Ce document s’inspire de Serving XHTML with the Right MIME Type.