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]

Recursos relacionats

Comentaris

Afegir un comentari