Перенаправление в зависимости от предпочтительного языка (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 были некоторые предостережения, но я никогда не использовал его из-за штрафов за задержку. Удачи!

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