Выбор языка через MultiViews работает только частично при запросе другого ресурса

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

  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 или аналогичные, и это будет использоваться для (а) установить печенье и (б) установить 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 ответ

Решение

Теперь я решил проблему, смешав выбор языка между 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_, но по крайней мере это работает сейчас.

Другие вопросы по тегам