Как перенаправить на основе Accept-Language с помощью Apache / mod_rewrite

Для переадресации языков мы в настоящее время создаем папки в корневом каталоге веб-сайтов, содержащие файл index.php, который проверяет переменную сервера HTTP_ACCEPT_LANG . например, для URL- www.example.com/press/

в /var/www/site/press/index.php :

 <?php if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "en") header("location: ../press_en.php"); else header("location: ../press_de.php"); ?> 

Поскольку сайт вырос, у нас теперь много таких папок. Я пытаюсь очистить это, переместив перенаправления в один файл .htaccess:

 RewriteEngine on # Set the base path here RewriteBase /path/to/site/ # The 'Accept-Language' header starts with 'en' RewriteCond %{HTTP:Accept-Language} (^en) [NC] # EN redirects RewriteRule press(/?)$ press_en.php [L,R] # DE redirects (for all languages not EN) RewriteRule press(/?)$ press_de.php [L,R] 

Идея такая же, как и файл php, но она не работает. Я пробовал все возможные настройки языка / заказы в настройках Firefox и проверял правильность заголовков, но он всегда служит для файла press_de.php .

Что я делаю неправильно, или есть лучший способ? (не включая согласование контента / мультивизоры или что-либо, что требует переименования файлов, в настоящее время это не вариант) .

Solutions Collecting From Web of "Как перенаправить на основе Accept-Language с помощью Apache / mod_rewrite"

Я бы поставил индикатор языка в начале URL-адреса, например /en/… или /de/… Затем вы можете использовать один скрипт, который проверяет предпочтительный язык и перенаправляет запрос, добавив индикатор языка:

 // negotiate-language.php $availableLanguages = array('en', 'de'); if (!preg_match('~^/[az]{2}/~', $_SERVER['REQUEST_URI'])) { $preferedLanguage = someFunctionToDeterminThePreferedLanguage(); if (in_array($preferedLanguage, $availableLanguages)) { header('Location: http://example.com/'.$preferedLanguage.$_SERVER['REQUEST_URI']); } else { // language negotiation failed! header($_SERVER['SERVER_PROTOCOL'].' 300 Multiple Choices', true, 300); // send a document with a list of the available language representations of REQUEST_URI } exit; } 

И соответствующие правила:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/]+)$ negotiate-language.php [L] RewriteRule ^([az]{2})/([^/]+)$ $2_$1.php [L] 

Обратите внимание: вам нужна правильная функция someFunctionToDeterminThePreferedLanguage поскольку поле заголовка Accept-Language не является единственным значением, а списком квалифицированных значений. Таким образом, может быть больше одного значения, и первое значение не всегда является предпочтительным значением.

в htaccess

 RewriteEngine on RewriteCond %{HTTP:Accept-Language} (en) [NC] RewriteRule .* server.com/press_en.php [L] RewriteCond %{HTTP:Accept-Language} (de) [NC] RewriteRule .* server.com/press_de.php [L]