Для переадресации языков мы в настоящее время создаем папки в корневом каталоге веб-сайтов, содержащие файл 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
.
Что я делаю неправильно, или есть лучший способ? (не включая согласование контента / мультивизоры или что-либо, что требует переименования файлов, в настоящее время это не вариант) .
Я бы поставил индикатор языка в начале 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]