Перейти к содержанию

accept-language: Модуль NGINX Accept-Language

Установка

Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и 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

Включите модуль, добавив следующее в верхнюю часть файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_accept_language_module.so;

Этот документ описывает nginx-module-accept-language v1.0.0, выпущенный 30 октября 2018 года.


Этот модуль анализирует заголовок Accept-Language и предоставляет наиболее подходящую локаль для пользователя из списка поддерживаемых локалей вашего сайта.

Синтаксис

set_from_accept_language $lang en ja pl;
  • $lang — это переменная, в которой будет храниться локаль
  • en ja pl — это локали, поддерживаемые вашим сайтом

Если ни одна из локалей из Accept-Language недоступна на вашем сайте, переменная устанавливается в первую локаль из поддерживаемых локалей вашего сайта (в данном случае en).

Предостережение

В настоящее время предполагается, что Accept-Language отсортирован по значениям качества (по моим тестам это так для Safari, Firefox, Opera и IE) и отбрасывает q (см. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html). В ситуации, когда я использую модуль, это предположение работает... но покупатель, будьте осторожны :-)

Пример конфигурации

Если у вас есть разные поддомены для каждого языка

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

Или вы можете сделать что-то подобное, перенаправляя людей, приходящих на '/', на /en (или /pt):

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

Почему я это создал?

Я использую кэширование страниц с merb на многоязычном сайте, и мне нужен был способ обслуживать правильную языковую страницу из кэша. Скоро я размещу пример на http://gom-jabbar.org

Благодарности

Спасибо Эвану Миллеру за его руководство по написанию модулей nginx.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-accept-language.