У меня есть небольшой сайт, доступный на разных языках, которые выбраны на основе следующих критериев (в порядке возрастания предпочтений):
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
или аналогичный, и он будет использоваться для (а) установки 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-файл только для установки предпочтительного языка по какой-то причине.И я до сих пор не понял, почему.Любая помощь?