Negociació de contingut amb .htaccess
Publicat el 07/08/2008
Usar documents XHTML estàtics amb un MIME Type correcte (application/xhtml+xml) i alhora degradar correctament per Internet Explorer i altres navegadors deficients és un problema.
Si el servidor web és un Apache, es pot usar el mòdul mod_rewrite per decidir en funció de la capçalera HTTP Accept si servir application/xhtml+xml o text/html.
Usant .htaccess per fer la reescriptura el problema es resol amb:
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteRule ^(.+\.html)$ $1 [T=application/xhtml+xml]
La primera línia activa el mòdul.
La segona és una condició que rep la variable HTTP_ACCEPT (la qual conté la capçalera HTTP Accept) i l'expressió regular application/xhtml\+xml i mira si hi ha coincidència.
La darrera línia aplica només si la condició anterior és certa. En aquest cas, reescriu la URI deixant-la igual però afegint el modificador T amb valor application/xhtml+xml.
El modificador T permet forçar el tipus de contingut (Content-Type) de la URI reescrita.
Donat que s'usa aquesta decisió en el moment de servir el document i que el document no es modifica, usar un <meta http-equiv="Content-Type" …/> ja que caldria posar un MIME Type a l'atribut @content i en algun cas no seria correcte. Per tant millor no usar l'element /meta en aquest cas.
Al no posar l'element /meta no s'està especificant la codificació del document. Això quan s'usa XML (application/xhtml+xml) no és un problema ja que la codificació per defecte és UTF-8 però quan el contingut es serveix com a HTML (text/html) la codificació per defecte és la d'HTTP: ISO-8859-1.
Per evitar problemes, val la pena forçar la codificació des del document .htaccess amb una regla AddCharset.
Usant UTF-8 als documents XHTML, el document .htaccess final queda com:
AddCharset utf-8 html
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteRule ^(.+\.html)$ $1 [T=application/xhtml+xml]
Per descomptat, si s'usen diverses codificacions en documents HTML, aquesta regla caldrà condicionar-la perquè només afecti als documents correctes.
Com a últim afegit, per aconseguir que validadors com el del W3C, agafin el MIME Type correcte, es poden afegir condicionals opcionals:
AddCharset utf-8 html
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} W3C_Validator [OR]
RewriteCond %{HTTP_USER_AGENT} WDG_SiteValidator [OR]
RewriteCond %{HTTP_USER_AGENT} W3C-checklink [OR]
RewriteCond %{HTTP_USER_AGENT} Web-Sniffer [OR]
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteRule ^(.+\.html)$ $1 [T=application/xhtml+xml]
Comentaris