Когда пользователи запрашивают /
, Я хочу перенаправить их на /en
или /de
, в зависимости от их предпочтений, указанных в заголовке HTTP-запроса Accept-Language
.
Я думаю, это легко сделать со сценариями на стороне сервера, но мне нужен .htaccess
решение, так как оно должно работать на статическом сайте.
Что пробовал:
mod_negotiation (либо с типовой картой, либо с MultiViews
вариант):
Пользователи получают свой предпочтительный язык, но они не перенаправляются.
mod_rewrite (RewriteCond %{HTTP:Accept-Language}
):
Пользователи перенаправляются, но они не (обязательно ‡) понимают предпочитаемый язык.
(‡ Он также не гарантирует, что язык имеет значение качества больше 0, и не находит предпочтительный язык, если оба языка указаны с разными значениями качества.)
Есть ли решение для этого?
Независимо от того, выполняете ли каким-либо образом переадресацию согласования контента или позволяете проверять / сравнивать значения качества в RewriteCond
директива или что-то совершенно другое.
Некоторые мысли:
Если у вас есть доступ к конфигурации сервера, возможно, есть выход: использование 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, но я никогда не использую его из-за штрафов за задержку. Удачи!