22.20. Использование Content Negotiation для предоставления страниц на разных языках
Проблема
Ваш веб-сайт посещают пользователи, говорящие на разных языках. Требуется, чтобы Apache автоматически распознавал предпочтительный язык каждого посетителя и предоставлял страницы на соответствующем языке, улучшая удобство использования сайта и расширяя его аудиторию.
Решение
Apache поддерживает механизм Content Negotiation, который позволяет серверу автоматически выбирать и отображать страницы на языке, предпочитаемом пользователем. Для этого создайте несколько версий страницы на разных языках и настройте файл типа карты, содержащий ссылки на все локализованные версии. Этот файл должен иметь расширение .var
.
На стороне клиента пользователь должен указать предпочитаемый язык в настройках браузера. Apache, в свою очередь, выберет наиболее подходящую языковую версию в зависимости от заголовка Accept-Language
в запросе HTTP.
Пример настройки файлов для Content Negotiation
В каталоге htdocs
(обычно расположенном по пути /var/www
) создайте версии файла index.html
для каждого поддерживаемого языка:
/var/www/index.html.ca
/var/www/index.html.cz.iso8859-2
/var/www/index.html.de
/var/www/index.html.dk
/var/www/index.html.ee
/var/www/index.html.el
/var/www/index.html.en
/var/www/index.html.es
/var/www/index.html.et
/var/www/index.html.fr
Затем создайте файл /var/www/index.html.var
и настройте его, указав пути к каждой языковой версии, директивы Content-language
для языка и Content-type
для формата и кодировки каждого файла:
URI: index.html.ca
Content-language: ca
Content-type: text/html
URI: index.html.cz.iso8859-2
Content-language: cs
Content-type: text/html;charset=ISO-8859-2
URI: index.html.de
Content-language: de
Content-type: text/html
# Запись по умолчанию
URI: fallback.html
Content-type: text/html
Последняя запись, fallback.html
, служит страницей по умолчанию на случай, если Content Negotiation не определит подходящий вариант. На этой странице можно разместить ссылки на все доступные языковые версии.
Чтобы включить обработку файлов .var
, убедитесь, что в конфигурационном файле httpd.conf
раскомментирована строка:
AddHandler type-map .var
Комментарий
Механизм Content Negotiation, хотя и является частью стандарта HTTP/1.1, до сих пор не получил широкого распространения. Не все браузеры поддерживают его, а не все пользователи настраивают предпочтительный язык в браузере. Кроме того, Content Negotiation может замедлять обработку запросов, так как сервер проверяет несколько вариантов контента.
Как работает выбор языка в Apache
Когда пользователь с установленными предпочтениями языка посещает многоязыковой веб-сайт, Apache анализирует заголовок HTTP Accept-Language
, чтобы определить, какой языковой вариант страницы отображать. Например, если пользователь указал французский язык в браузере (например, Mozilla), HTTP-запрос может содержать следующую информацию:
Accept-Language: fr;q=1.0, en;q=0.5
Apache сначала попытается отобразить страницу на французском языке. Если таковой нет, он выберет следующий предпочтительный вариант — английский. В случае отсутствия подходящих страниц посетитель получит ошибку 406 "Not Acceptable" с перечнем доступных версий, например:
Not Acceptable
An appropriate representation of the requested resource /foo/index.html could not be found on this server.
Available variants:
index-en.html
index-fi.html
Механизм Content Negotiation может быть полезен для предоставления многоязычного контента на сайтах с международной аудиторией. Однако для повышения производительности рекомендуется использовать дополнительные методы, такие как редиректы на язык сайта или настройка языковых поддоменов.
См. также
Глава 22. Введение, Раздел 22.4. Добавление новых модулей после установки Apache