Saltar la navegación

Negociación de contenidos

Apache admite la negociación de contenidos como se describe en la especificación HTTP/1.1. Puede elegir la mejor representación de un recurso en función de las preferencias proporcionadas por el navegador en cuanto a tipo de medio, idiomas, juego de caracteres y codificación.

La negociación de contenidos la proporciona el módulo mod_negotiation, que está cargado de forma predeterminada.

Un recurso puede estar disponible en varias representaciones diferentes. Por ejemplo, podría estar disponible en diferentes idiomas o diferentes tipos de medios, o una combinación. Los servidores pueden elegir automáticamente la mejor opción en base a la información que el navegador del cliente envía en la cabecera de la petición. Un claro ejemplo es el idioma preferente del cliente. Con la cabecera Accept-Languaje, el cliente puede indicar, por orden de preferencia, uno o varios idiomas en los que le gustaría obtener la página web solicitada, por ejemplo, primero en español y si no, en inglés:

Accept-Language: es; q=1.0, en; q=0.5

Para poder negociar un recurso, es necesario proporcionar al servidor información sobre cada una de las variantes. Esto se hace de una de dos maneras:

  • Mediante MultiViews, donde el servidor recupera el recurso adecuado a través de la coincidencia de patrones de nombres de ficheros.
  • Usando ficheros de mapa, donde se especifican directamente los ficheros a servir.

Para llevar a cabo el primero de los métodos necesitamos especificar el valor MultiViews de la directiva Options aplicado a un directorio concreto.

El efecto de MultiViews es el siguiente: si el servidor recibe una solicitud de /ruta/a/directorio/solicitud.html o /ruta/a/directorio/solicitud, si /ruta/a/directorio tiene MultiViews habilitado y /ruta/a/directorio/solicitud.html no existe, entonces el servidor lee el directorio buscando archivos que sigan el patrón solicitud.html.*, y si existen, elige el que mejor se adapta a las necesidades del cliente. Para el ejemplo anterior, elegiría antes /ruta/a/directorio/solicitud.html.es a /ruta/a/directorio/solicitud.html.en, pues el cliente había mostrado su preferencia por el idioma español antes que por el inglés.

Lo que debemos hacer es crear las páginas web en varios idiomas, añadiéndoles a los ficheros al final la extensión .es, .en, .fr, etc. Se deben usar las letras que definen el idioma y podemos verlas aquí, aunque también las podemos ver en la configuración del idioma del navegador.

Y con respecto a la configuración de Apache, hay que habilitar Multiviews en los directorios donde tenemos las páginas web traducidas a varios idiomas.

<Directory ...>
...
Options +Multiviews
...
</Directory>

El signo + se ha añadido porque queremos conservar el resto de valores que ya tuviera activada la directiva Options, pero eso dependerá del caso concreto en el que estemos.

El método de los ficheros de tipo mapas consiste en especificar directamente para cada uno de los recursos a servir, las características que tienen y así saber elegir según lo que pide el cliente. Para el caso de la solicitud de /ruta/a/directorio/solicitud.html, vamos a crear el fichero de mapa solicitud.html.var (es común utilizar la extensión .var) y los ficheros solicitud.html.* de cada uno de los idiomas. Todos los ficheros los vamos a crear en el mismo directorio, concretamente en /ruta/a/directorio.

Dentro de los ficheros mapas, las referencia relativas a los archivos son con respecto al directorio donde se encuentra el fichero .var.

El contenido de solicitud.html.var podría ser el siguiente:

URI: solicitud.html

URI: solicitud.html.spanish
Content-type: text/html
Content-language: es

URI: solicitud.html.english
Content-type: text/html
Content-language: en

Como vemos, ahora no es obligatorio acabar los ficheros con la abreviatura del idioma, ya que los ficheros se nombran explícitamente, no como en el método anterior.

También vemos que hemos usado rutas relativas para referirnos a los ficheros.

En cuanto a la configuración de Apache haremos lo siguiente:

  • Sobre el directorio debemos activar la negociación de contenidos con Multiviews, igual que antes.
  • Asociamos los ficheros .var al controlador de mapas, la parte de Apache que los interpretará. Esto lo haremos con la directiva AddHandler.
  • Activamos el uso de mapas en la negociación de contenidos a través de la directiva MultiviewsMatch.
<Directory ...>
...
Options +Multiviews
AddHandler type-map .var
MultiviewsMatch Handlers
...
</Directory>