Перенаправление в зависимости от предпочтительного языка (Accept-Language) с помощью.htaccess
Когда пользователи запрашивают /
Я хочу перенаправить их на /en
или же /de
в зависимости от их предпочтений, указанных в заголовке HTTP-запроса Accept-Language
,
Я думаю, это легко с серверными сценариями, но мне нужно .htaccess
Решение, как это должно работать для статического сайта.
Что я пробовал:
mod_negotiation (либо с картой типа, либо с
MultiViews
опция):Пользователи получают предпочитаемый язык, но не перенаправляются.
mod_rewrite (
RewriteCond %{HTTP:Accept-Language}
):Пользователи перенаправляются, но не получают (обязательно ‡) предпочитаемый язык.
(‡ Он также не гарантирует, что язык имеет значение качества больше 0, и не находит предпочтительный язык в случае, если оба языка указаны с разными значениями качества.)
Есть ли решение для этого?
Независимо от того, осуществляется ли перенаправление согласования содержимого каким-либо образом или позволяет проверить / сравнить значения качества в RewriteCond
директива, или что-то совершенно другое.
2 ответа
Некоторые мысли:
Если у вас есть доступ к конфигурации сервера, может быть способ: использовать директиву RewriteMap в конфигурации вашего сервера.
Затем вы можете отправить Accept-Language
заголовок Perl или любого другого скрипта, который вернет предпочтительный язык, который вы можете использовать в вашем RewriteRule с 301.
Если у вас есть доступ к языку, как php
, вы можете использовать файл index.php в/
"который отправит перенаправление с функцией header('Location: /en/static-pages.html')
, С php 5.3 есть также функция locale_accept_from_http()
, который возвращает предпочтительный языковой стандарт из заголовка.
Но важно: вы хотите, чтобы пользователи "get their preferred language"
, Вы уверены, что эта техника заставляет пользователя выбирать предпочитаемый язык? Так много людей не устанавливают это в своих настройках браузера. Автоматический выбор языка должен (должен?) Сочетаться с запоминанием выбора пользователя (cookie), и выбор пользователя должен (должен?) Иметь приоритет над автоматическим выбором.
Отказ от ответственности: я не проверял это. В прошлом я использовал нечто подобное для логики этого типа, используя mod_alias для установки переменных и позволяя mod_rewrite обрабатывать несколько условий. Это облегчается в Apache 2.4 с операторами If.
RewriteEngine On
SetEnvIf Request_URI ^/$ toplevel
SetEnvIf Accept-Language 'fr' lang_french
RewriteCond %{ENV:toplevel} 1
RewriteCond %{ENV:lang_french} 1
RewriteRule ^ /fr [R=302,L]
Я должен добавить, что этот пример использует конфигурацию apache, а не.htaccess. Я помню, что в mod_rewrite в.htaccess были некоторые предостережения, но я никогда не использовал его из-за штрафов за задержку. Удачи!