Выбор языка через MultiViews работает только частично при запросе другого ресурса
У меня есть небольшой сайт, который доступен на разных языках, которые выбраны на основе следующих критериев (в порядке возрастания предпочтений):
Accept-Language
отправлено браузером- Файл cookie, указывающий предпочитаемый язык
- Путь запроса, содержащий предпочтение языка в конце
Сам сайт состоит только из статических 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
который работает нормально с августа или около того, чтобы учесть следующее:
- Нет файлов cookie,
Accept-Language
берет на себя (благодаряMultiViews
) - Cookie присутствует, язык cookie будет использоваться (
prefer-language
) - Путь запроса
/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_
, но по крайней мере это работает сейчас.