Negociación de contenidos
Apache puede escoger la mejor representación de un recurso basado en las preferencias proporcionadas por el navegador (browser) para los distintos tipos de medios, idiomas, conjunto de de caracteres y codificación. A esta funcionalidad se le llama negociación de contenidos. Un recurso puede estar disponible en diferentes representaciones. Por ejemplo, puede estar disponible en diferentes idiomas, es posible que el servidor haga una selección automáticamente de la página que tiene que servir. Esto funciona porque los navegadores pueden enviar como parte de su petición información sobre qué representación prefieren. Por ejemplo, un navegador podría indicar que prefiere ver información en francés y, si no fuera posible, en inglés. Los navegadores indican sus preferencias a través de cabeceras en la petición. Para pedir representaciones únicamente en español, el navegador podría enviar algo así:
Accept-Language: es
Para llevar a cabo esta funcionalidad Apache2 utiliza el módulo negotiation_module
que está habilitado por defecto.
Configuración del módulo de negociación de contenidos con Multiviews
Queremos que al acceder a la ULR www.pagina1.org/internacional
se muestre un index.html
con el idioma adecuado según la cabecera Accept-Languaje
enviada por el cliente.
Lo primero que tenemos es crear varios ficheros index.html
con los distintos idiomas ofrecidos por el servidor:
# ls /var/www/html/internacional
index.html.en index.html.es
Hemos creado dos ficheros: index.html.en
para el idioma inglés y index.html.es
para el español.
A continuación debemos activar la opción Multiviews
para el directorio con el que estamos trabajando, por lo tanto en el fichero de configuración del virtual host /etc/apache2/sites-availables/pagina1.conf
creamos una sección Directory
:
...
<Directory /var/www/html/internacional>
Options +Multiviews
</Directory>
...
Ya tan sólo tenemos que configurar el idioma en el navegado y acceder a la URL y podemos comprobar como se sirve las distintas páginas según el idioma seleccionado.
Configuración del módulo de negociación de contenidos con ficheros type-map
Un handler
es una representación interna de Apache de una acción que se va a ejecutar cuando hay una llamada a un fichero. Generalmente, los ficheros tienen handlers implícitos, basados en el tipo de fichero de que se trata. Normalmente, todos los ficheros son simplemente servidos por el servidor, pero algunos tipos de ficheros se tratan de forma diferente.
Nosotros vamos a tener un fichero especial que denominamos type-map con extensión var
al que le vamos a crear un handler para manejarlo de una manera especial para el negociado de contenidos.
Los ficheros de tipo mapa tienen una entrada para cada variante disponible. Estas entradas consisten en líneas de cabecera contiguas en formato HTTP. Las entradas para diferentes variantes se separan con líneas en blanco. Las líneas en blanco no están permitidas dentro de una entrada. Existe el acuerdo de empezar un fichero mapa con una entrada para la entidad combinada como un todo.
Por lo tanto la configuración del directorio sería:
<Directory /var/www/html/internacional>
DirectoryIndex index.var
AddHandler type-map .var
</Directory>
...
Con la directiva DirectoryIndex
indicamos que el fichero por defecto será index.var
.
En el directorio /var/www/html/internacional
, ademas de tener los ficheros: index.html.en
y index.html.es
, tendremos un fichero index.var
con el siguiente contenido:
URI: index
URI: index.html.en
Content-type: text/html
Content-language: en
URI: index.html.es
Content-type: text/html
Content-language: es