Как перенаправить на основе Accept-Language с Apache / mod_rewrite - PullRequest
4 голосов
/ 02 ноября 2009

Для языковых перенаправлений в настоящее время мы создаем в корневом веб-каталоге папки, содержащие файл index.php, который проверяет серверную переменную HTTP_ACCEPT_LANGUAGE. например для 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.

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

Ответы [ 2 ]

6 голосов
/ 02 ноября 2009

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

// negotiate-language.php
$availableLanguages = array('en', 'de');
if (!preg_match('~^/[a-z]{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 ^([a-z]{2})/([^/]+)$ $2_$1.php [L]

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

2 голосов
/ 18 марта 2016

в 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]
...