Выбор языка через MultiViews работает только частично при запросе другого ресурса - PullRequest
1 голос
/ 13 ноября 2011

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

  1. Accept-Language, отправленных браузером
  2. Файл cookie с указанием предпочтительного языка
  3. Путь запроса, содержащий в конце языковые предпочтения

Сам сайт состоит только из статических HTML-страниц и, насколько возможно, я бы хотел его сохранитьсюда.Я реализовал выбор языка через mod_negotiation, mod_rewrite и следующий файл .htaccess (сокращенный, чтобы пропустить объявление языков и кодировок):

Options FollowSymLinks MultiViews
DirectoryIndex index

Header set Pragma no-cache

RewriteEngine on
RewriteRule ^([a-zA-Z-]{2,5})$ index [CO=language:$1:.example.com:525600,E=LANG:$1]

SetEnvIf Cookie "language=([a-zA-Z-]+)" COOKIE_LANG=$1

SetEnvIf COOKIE_LANG (.+) prefer-language=$1
SetEnvIf REDIRECT_LANG (.+) prefer-language=$1

# plenty of AddLanguage and AddCharset calls

LanguagePriority en-us
DefaultLanguage en-us
ForceLanguagePriority Prefer Fallback

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

  1. Файл cookie отсутствует, Accept-Language вступает во владение (благодаря MultiViews)
  2. Файл cookie присутствует, язык файла cookie будет использоваться (prefer-language)
  3. Путь запроса /es или аналогичный, и он будет использоваться для (а) установки cookie и (б) установки prefer-language на это значение.

Теперь,У меня есть еще несколько ресурсов на сайте, которые, благодаря MultiViews, могут быть выбраны с помощью /resource вместо /resource.html, и согласование содержимого и опция cookie все еще работают нормально для выбора соответствующего языка здесь.

Теперь я хотел расширить обработку URI, чтобы такие вещи, как /resource/en, работали с прямым выбором ресурса на определенном языке, чтобы это работало не только для /.Я попробовал следующее RewriteRule:

RewriteRule ^(([^/]+)/)?([a-zA-Z-]{2,5})$ /$2 [CO=language:$3:.example.com:525600,E=LANG:$3]

, и оно работает, поскольку правильный ресурс отправляется и правильный файл cookie установлен, но предпочтительный язык, по-видимому, больше не берется из переменной среды.Теперь единственное, что заставляет выбирать язык, - это cookie, но он все тот же, что и в предыдущем запросе, поэтому я не увижу новый язык, пока не обновлю страницу.Ничто из того, что я до сих пор пробовал с правилами, не повлияло на это поведение.Интересно, что с этим правилом старое документированное выше поведение все еще работает нормально.Только если я запрашиваю что-то отличное от /, оно делает странные вещи.

Это на общем хостинге (в тюрьме FreeBSD), поэтому я не могу включить журнал перезаписи (поскольку я даже незнать физический путь к файлам);кроме того, вполне очевидно, что он игнорирует переменную среды и использует cookie-файл только для установки предпочтительного языка по какой-то причине.И я до сих пор не понял, почему.Любая помощь?

1 Ответ

1 голос
/ 14 ноября 2011

Я решил проблему, смешав выбор языка между RewriteRule и SetEnvIf:

SetEnvIf Cookie "language=([a-zA-Z-]+)" prefer-language=$1
SetEnvIf REDIRECT_prefer-language "(.+)" prefer-language=$1
SetEnvIf Request_URI "/([a-zA-Z-]{2,5})$" prefer-language=$1

RewriteRule "^(([^/]+)/)?([a-zA-Z-]{2,5})$" /$2 [CO=language:$3:.example.com:525600]

Правило теперь устанавливает только cookie и указывает на правильный ресурс, в то время как выбор языка обрабатывается путем сопоставления с URI запроса. Все еще чувствует себя странно, тем более, что это не так легко увидеть, когда что-то должно начинаться с префикса REDIRECT_, но по крайней мере это работает сейчас.

...