Настройка отображения языка с помощью Apache MultiViews

Вопрос

Как я могу использовать подход MultiViews на веб сервере Apache для автоматического обслуживания ресурсов на том языке, к которому был отправлен HTTP запрос?

Клиентское приложение запрашивает документ с сервера, информация о языковых предпочтениях пользователя, как правило, передается на сервер через заголовок HTTP Accept-Language. Если сервер сохраняет страницы на более чем одном языке, то эта HTTP информация может быть использована для получения страницы на том языке, который пользователь предпочитает, если тот язык доступен. Если на сервере есть только одна версия страницы, то она и будет получена.

Механизм выбора соответствующей страницы для возвращения пользователю, основанный на Accept-Language информации в HTTP запросе, и он называется согласование языка.

Во многих случаях клиентское приложение имеет правильные исходные настройки. Например, если у вас есть Японская версия браузера, то браузер обычно предполагает, что вы предпочитаете страницам на Японском языке, и отправляет эту информацию на сервер. Основные браузеры позволяют изменять эти языковые предпочтения. Для получения дополнительной информации смотрите Установка языковых предпочтений в браузере.

В Apache есть два различных подхода к согласованию ресурса. Первый предполагает использование файла типа map (например, .var файл) который называет файлы, содержащие ожидаемые варианты, второй предполагает использование 'MultiViews' поиска, где сервер делает неявное сопоставление имени файла шаблона и выбирает из числа результатов. Опция MultiViews также может быть установлена ​​для каждой папки, если это разрешил администратор сервера.

В данной статье рассматривается вопрос о том, как настроить документы на сервере Apache, используя подход MultiViews, так чтобы работало согласование языка.

Ответ

Во-первых, обратите внимание, что согласование языка как может быть лучшим способом для обслуживания вашего многоязычного контента для ваших читателей, так может и не быть. В некоторых случаях, например, локализованные сайты могут лучше поддерживаться путем сохранения переведенных версий страницы в папки с соответствующими языками или путем смешивания вышеупомянутых двух подходов. Какой подход является более целесообразным, и в какой ситуации, будет рассматриваться в следующей статье.

Настройка согласования языка включает в себя:

  1. разработку стратегии для обозначения различных языковых версий файла,
  2. планирование резервной стратегии действий при запросе языков, которые вы не поддерживаете, и
  3. установление соответствующих серверных директив, чтобы все работало.

Существует несколько способов настроить согласования языка на серверах Apache, и правильный подход будет зависеть от настроек более высокого уровня и от включенных или отключенных администратором сервера привилегий. Возможно, вам придется обратиться к администратору сервера, чтобы проверить, какой подход доступен и какие вы имеете привилегии.

Учитывая несколько путей, по которым настройки сервера могут меняться, трудно просто и окончательно описать, как настроить согласование языка. Далее приведено описание типового подхода. Будем считать, что опция MultiViews включена (по умолчанию) и , что пользователь может изменить некоторые директивы файлов .htaccess (небольшие текстовые файлы в структуре папки). Для того чтобы подход с .htaccess файлом работал, директива AllowOverride должна быть правильно настроена администратором сервера. Вам необходимо обратиться к администратору сервера, чтобы узнать подходит для вас такой подход.

Мы предлагаем использовать следующий пример: документ под названием example.html доступен на 3-х языках: Английском, Французском и Немецком, а по умолчанию используется Английский язык. Несмотря на то, что пример ограничивает себя .html файлами, согласования языка может быть применено к другим типам файлов.

Наименование файлов

Каждая языковая версия указывается специальным расширения, которое может появляться до или после .html расширения. На практике, есть некоторые соображения относительно размещением этого расширения, которые нужно иметь в виду.

Если вы поставите расширение языка в конце, то .html расширения могут быть включены или исключены при обращении к файлу. Тем не менее, эта стратегия может сделать файлы более трудными для чтения или редактирования, если они не находятся на сервере Apache (например, читать с другого сервера, компакт-диска или жесткого диска). Это потому, что большинство редакторов и обозревателей, чтобы определить какой это тип файла и как с ним обращаться просто смотрят на последнее расширение. Для нашего примера Английский, Французский и Немецкий файлы будут названы, соответственно, таким образом:

Если в конце вы поставите .html расширение, вы облегчите чтения и редактирования файлов, если они не находятся на сервере Apache, но для доступа к ресурсу на сервере Apache имя должно всегда быть набрано в адресной строке браузера или указанное в гиперссылке и т.д., без расширений (например <a href="example">...</a>). В нашем примере, имена файлов будут такие:

В действительности приведенные языковые метки могут быть любыми, такой длины, которую вы для них определите на сервере (см. ниже). Сервер скорее всего, уже определяет 2-х буквенные расширения языка из глобальных настроек в его файле httpd.conf. Мы рекомендуем использовать ISO коды языков и стран, так как указано в BCP 47, поскольку это обеспечивает большую последовательность и легкое распознавание меток языка.

Вы должны быть осторожны с некоторыми расширениями. Например, использование кода ISO .pl для Польского языка, будет путать его с расширением, что обычно используется для обозначения Perl документов. Таким образом, если вы хотите, то для польского языка вы можете использовать следующее обозначение pl-PL.

Обратите внимание, что пользователи могут обращаться к конкретному файлу, введя полное имя файла, например example.fr.html будет загружаться на французском языке, независимо от языковых настроек.

Директивы сервера

Вы обычно используете директиву AddLanguage, чтобы указать, какие расширения указаны для определенного языка контента в входном HTTP.

Например, следующая директива направляет HTTP запрос контента, что написанный на Французском языке на расширение .fr:

AddLanguage fr .fr

Есть несколько мест, где вы это можете указать. Это, возможно, уже отмечено в глобальном масштабе за счет записи в файл сервера httpd.conf, или администратор сервера может ее туда добавить. Кроме того, при загрузке контента пользователем он может указываться в файле в иерархии папок. Такой файл, как правило, называется .htaccess.

Файлы по умолчанию

Важно указать файл по умолчанию, так что пользователь, не имеющий Английского, Французского или Немецкого языка в своем списке предпочитаемых языков (скажем, например, Испанский пользователь), или чье клиентское приложение не поддерживает согласование контента, или в противном случае вы получите не файл, а HTTP 406 результат (НЕ ПРИЕМЛЕМЫЙ).

Лучший способ указать файл по умолчанию будет меняться, в зависимости от вашего расширения языка - то ли оно предшествует, то ли оно следует за .html расширением, и от того какую версию Apache вы используете. В приведенных ниже примерах будем считать, что по умолчанию установлен ​​Английский язык (вероятно, чаще всего он может быть лучшим выбором по умолчанию, с учетом широкого распространения Английского языка).

Указание файлов по умолчанию на Apache 2.0.30 и выше

В версиях 2.0.30 и выше на сервере Apache используя директивы ForceLanguagePriority и LanguagePriority вы довольно четко можете указать файл по умолчанию (для получения детального описания работы этих директив пройдите по ссылке).

Для нашего примера, мы могли бы установить Английский язык по умолчанию, используя следующие две строки:

LanguagePriority en fr de
ForceLanguagePriority Fallback

Теперь, если Испанские пользователи будут запрашивать Испанский документ в контексте нашего примера, то вместо Испанского они получат Английский документ. То есть первый пункт из списка LanguagePriority.

Указание файлов по умолчанию Apache от 1.3.4 до 2.0.29

Если версия вашего сервера предыдущая к 2.0.30, то вам придется сделать очень много работы, чтобы указать файл по умолчанию, поскольку здесь не доступна директива ForceLanguagePriority. Кроме того, подход будет зависеть от того где стоит расширение языка: до или после .html расширения.

Сначала давайте рассмотрим случай, когда расширение языка стоит до .html расширения (то есть ресурсы всегда должны быть набраны в адресной строке браузера или указанные в гиперссылке и т.д., без .html расширения). Для установки Английского языка по умолчанию можно создать копию Английского файла в папке с последующим именем:

example.html

Если ваше расширение языка находится после .html (то есть .html расширения могут быть включены или исключены при обращении к файлу), тогда необходимо назвать свою копию Английского файла следующим образом:

example.html.html

Файл по умолчанию имеет такое расширение .html.html потому что, если файл по умолчанию был назван example.html и пользователь запросил файл, как example.html, то согласование контента никогда не состоится (потому что не сможет найти точного соответствия).

Кстати говоря

Если в папке есть только один файл с заданным именем и нет расширения языка, то он будет обслуживаться независимо от языковых предпочтений клиента.

Эта техника может быть применена к другим типам файлов, кроме HTML. Мы просто использовали HTML пример здесь, поскольку это общее требование.