|
Negociación de contenidos en Apache
La negociación de contenidos especificada en los protocolos HTTP
versión 1.0 y 1.1 permite al servidor web y al navegador del
usuario ponerse de acuerdo en la mejor representación de un determinado contenido que
mostrar al usuario que visita la página. Los contenidos se pueden presentar y negociar en
diversos idiomas,conjuntos de caracteres o codificaciones distintas, pero nosotros en este
artículo nos limitaremos a ver la negociación de idioma, aunque la negociación
de otros parámetros de los contenidos es muy similar.
Como puede ver en este artículo sobre el protocolo
HTTP, cuando el navegador pide una página al servidor,
en la petición le informa (entre otras cosas) de su preferencia en cuanto a los idiomas en
que visualizar las páginas (cabecera Accept-Language), o los
conjuntos de caracteres visualizables (cabecera Accept-Charset). Si
en el servidor disponemos de las mismas páginas en diferentes idiomas (el cómo
decirle a Apache qué página corresponde a cada idioma
lo veremos luego), se podrá decidir para cada consulta cuál de ellas se
envía al navegador remoto, según la preferencia expresada en la cabecera
Accept-Language.
En ciertos navegadores es posible especificar varios idiomas, y el orden de preferencia entre
ellos, de tal manera que el servidor nos enviará las páginas en el primer idioma que
coincida con nuestras preferencias, o en el idioma predeterminado si no hay ninguna coincidencia.
En otros navegadores sólo se pedirá la página en el idioma en que esté
instalado el navegador, obteniendo las páginas en el idioma predeterminado del servidor si
no hay coincidencia. Por ejemplo, el Accept-Language puede ser:
Accept-Language: es,en;q=0.7,fr;q=0.3
Con esa cabecera nuestro navegador le dice al servidor, si es que éste está
configurado con negociación de contenidos, que le envíe la página en
español, de no disponer de ella en inglés, y en caso contrario en francés
(los parámetros q expresan precisamente la preferencia de cada
idioma, con q=1.0 siendo el más preferente). Si el servidor no
dispusiera de la página solicitada en ninguno de los idiomas solicitados por el navegador,
el servidor enviará la página en el idioma predeterminado que el administrador haya
configurado, o comunicará al navegador que no pudo encontrar ninguna representación
adecuada para el contenido solicitado (error HTTP 406 Not acceptable),
generando una página web donde enumerará las
representaciones disponibles, para que el usuario elija una de ellas.
Si queremos que nuestro navegador pida a los servidores web a los
que accedamos las páginas en nuestro idiomas favoritos, deberemos indicar este hecho en la
configuración del navegador. Por ejemplo, con Mozilla
deberíamos ir al menú Edit -> Preferences... -> Navigator
-> Languages. La configuración es lo bastante simple como para que no sea
necesario decir cómo se hace. Si queremos verificar que funciona como queremos podemos
acudir a alguna de las muchas páginas con negociación dinámica de idioma,
como por ejemplo Google o Debian.
Si queremos configurar nuestro servidor web
Apache para que soporte contenidos dinámicos primero debemos
asegurarnos de que está cargado el módulo mod_negotiation,
cosa bastante probable, puesto que está compilado por omisión. La
negociación de contenidos se puede activar en cualquier contexto, en concreto en todos
aquellos lugares donde sea válida la directiva "Options", por
ejemplo, en un contexto Directory o .htaccess.
Para ello es necesario activar la opción MultiViews en el archivo
/etc/apache/httpd.conf:
<Directory /var/www/documentos>
Options +MultiViews
</Directory>
O si preferimos usar el mecanismo de los archivos .htaccess, siempre
que esté permitido el uso de dicho mecanismo en el directorio correspondiente (siguiendo con
el ejemplo, en el archivo /var/www/documentos/.htaccess:
Options +MultiViews
En principio con lo anterior ya estaría activa la negociación de contenidos para
ese directorio y todos sus subdirectorios. Sin embargo suele ser útil configurar
qué archivo contiene la página índice de cada directorio, en el caso de que
el navegador no indique una página concreta. Para ello añadiríamos una
directiva "DirectoryIndex index.html" en alguno de los dos ficheros
indicados más arriba. Gracias a esta directiva cuando un navegador nos pida la
página http://www.example.com/documentos/, se asumirá que ha
pedido la página http://www.example.com/documentos/index.html.
Ahora sólo falta indicarle a Apache qué página
(qué archivo con el código HTML) corresponde a cada
idioma. Por la manera que hemos escogido para configurar la negociación de contenidos
(descrita junto con las demás posibilidades en
la documentación)
indicar a qué idioma corresponde cada archivo es tan fácil como añadir una
extensión igual al código ISO de país a cada
uno de los archivos. Por ejemplo, la página en español se llamará
index.html.es, la versión en inglés
index.html.en y la versión en francés será
index.html.fr.
Para enviar las páginas en un idioma predeterminado cuando el navegador y el servidor no
se pongan de acuerdo en un idioma común debemos crear cada página en este idioma
(posiblemente uno de los ya definidos), pero cuya extensión añadida a la del
archivo original no corresponda a ningún idioma posible. Es decir, si el idioma
predeterminado es el español, debemos hacer una copia del archivo
index.html.es con el nombre de, típicamente,
index.html.html. Si creamos el archivo
index.html lo que sucederá es que no tendrá lugar
negociación de contenidos alguna, puesto que la idea es que sea transparente al usuario,
para lo cual en las páginas siempre enlazaremos a index.html, y
no a alguna de las versiones "traducidas", dejando que sea Apache
quien, en el momento de la consulta, nos envíe la versión más adecuada a
nuestras preferencias (añadiendo autom&aaute;ticamente al final del nombre del archivo la
extensión correspondiente al código del país cuyo idioma sea el preferido).
Última modificación: 01-March-2003 11:10:14 -0500
|