24x7 Linux Página personal y profesional HTML 4.01 válido CSS válido
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

© 2002-2007 José Luis Domingo López. Todos los derechos reservados.
Contacte con el webmaster para informarle de fallos, incorrecciones o sugerencias.
Esta página cumple con los estándares HTML 4.01 y CSS2 del World Wide Web Consortium.