Saltar a contenido

accept-language: Módulo Accept-Language de NGINX

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • RedHat Enterprise Linux 7, 8, 9 y 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-accept-language
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-accept-language

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_accept_language_module.so;

Este documento describe nginx-module-accept-language v1.0.0 lanzado el 30 de octubre de 2018.


Este módulo analiza el encabezado Accept-Language y proporciona la configuración regional más adecuada para el usuario a partir de una lista de configuraciones regionales soportadas por tu sitio web.

Sintaxis

set_from_accept_language $lang en ja pl;
  • $lang es la variable en la que se almacenará la configuración regional
  • en ja pl son las configuraciones regionales soportadas por tu sitio web

Si ninguna de las configuraciones regionales de Accept-Language está disponible en tu sitio web, se establece la variable en la primera configuración regional de las configuraciones regionales soportadas por tu sitio web (en este caso, en).

Advertencia

Actualmente asume que el Accept-Language está ordenado por valores de calidad (por mis pruebas, este es el caso para safari, firefox, opera e ie) y descarta q (ver http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). En la situación en la que estoy usando el módulo, esta suposición funciona... pero el comprador que tenga cuidado :-)

Ejemplo de configuración

Si tienes diferentes subdominios para cada idioma

server {
    listen 80;
    server_name your_domain.com;
    set_from_accept_language $lang en ja zh;
    rewrite ^/(.*) http://$lang.your_domain.com redirect;
}

O podrías hacer algo como esto, redirigiendo a las personas que vienen a '/' a /en (o /pt):

location / {
    set_from_accept_language $lang pt en;
     if ( $request_uri ~ ^/$ ) {
       rewrite ^/$ /$lang redirect;
       break;
     }
}

¿Por qué lo creé?

Estoy usando caché de páginas con merb en un sitio web multilingüe y necesitaba una forma de servir la página en el idioma correcto desde la caché. Pronto pondré un ejemplo en http://gom-jabbar.org

Agradecimientos

Gracias a Evan Miller por su guía sobre cómo escribir módulos de nginx.

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-accept-language.