Ombre se lance, son site va être servi en application/xhtml+xml
, bon courage !
Si cette ligne semble anodine, je puis vous assurer qu'elle a de fortes répercussions sur la façon dont va être codé votre site, car si servir son site en classique text/html
ne pose que peu de contraintes, le servir en application/xhtml+xml
met des contraintes extrêmement fortes :
- Votre code doit être bien formé (syntaxiquement parlant), sinon les navigateurs modernes comme Firefox afficheront une erreur de parsing XML… et n'iront pas plus loin !
- Si votre site utilise les balises HTML5, je vous invite à (re)lire Pour migrer mon site vers XHTML5, j'ai détaillé tous les problèmes éventuels.
- Plus gênant, IE dit le mal nommé ne supporte pas les sites servis ainsi (jusqu'à la version 9 qui le supporte enfin), il existe bien une astuce pour le faire fonctionner, mais c'est très imparfait.
Il y a plus simple : il est possible via PHP de détecter si l'agent utilisateur accepte les sites servis en application/xhtml+xml
, voici la méthode :
<?php
$mystring = $_SERVER['HTTP_ACCEPT'];
$findme = 'application/xhtml+xml';
$pos = strpos($mystring, $findme);
if ($pos === false) {
$prologue='';
header('Content-type: text/html; charset=UTF-8');
} else {
$prologue='<?xml version="1.0" encoding="utf-8"?>'."\n";
header('Content-Type: application/xhtml+xml;charset=UTF-8');
}
?>
Le principe est simple, si l'agent utilisateur supporte ce mode de rendu, alors j'envoie les bons entêtes (headers), et j'affiche le prologue XML… qui une bonne fois pour toutes, ne sert que si on sert son site en application/xhtml+xml
!!! (pitié, arrêtez de le mettre, je le vois encore sur des sites que je reprends au travail, ça ne sert à rien pour 99% des sites)
Dans le cas contraire, je sers le site en classique text/html
.
Si vous voulez voir la différence, éditez la source de cette page sur Firefox, et ensuite sur IE8 par exemple. Vous verrez que la ligne du prologue disparait avec IE8.
Si vous utilisez HTML5, les métas ne changent pas, <meta charset="utf-8" />
marchant dans les deux cas. Avec HTML5, la détection se fait directement via les entêtes, et non plus via les méta-tags.
Dans le cas contraire, par exemple un bon vieux XHTML 1.0, on peut reprendre la même logique pour afficher le bon méta-tag :
<?php
$mystring = $_SERVER["HTTP_ACCEPT"];
$findme = "application/xhtml+xml";
$pos = strpos($mystring, $findme);
if ($pos === false) {
echo ' <meta http-equiv="content-Type" content="text/html; charset=UTF-8" />'."\n";
} else {
echo ' <meta http-equiv="content-Type" content="application/xhtml+xml;" />'."\n";
}
?>
Ainsi, vous ne pénaliserez pas trop les utilisateurs d'IE8 et inférieurs. Si j'osais un trait de cynisme totalement assumé… ils le sont déjà bien assez avec ces vieux navigateurs.